Global part for graph-generation nearly compleeted

git-svn-id: file:///home/jan/tmp/wetterstation/trunk@64 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
losinshi 2006-09-01 14:15:00 +00:00
parent bb1dfab7af
commit 27f0adec90
9 changed files with 209 additions and 91 deletions

View File

@ -6,7 +6,7 @@ LDFLAS = -o
INCL = -I$$(pg_config --includedir)
BIN_NAME = chart
OBJS = chart.o config.o drawing/process_image.o
OBJS = chart.o config.o common.o image_file/image_file.o
CONF_NAME = chart.conf
@ -29,9 +29,20 @@ $(BIN_NAME): $(OBJS)
@ echo Binary $(BIN_NAME) ist fertig!
# Abhängigkeiten
chart.o: chart.c definitions.h config.h chart.h drawing/process_image.h
config.o: config.c config.h definitions.h chart.h
drawing/process_image.o: drawing/process_image.c
chart.o: chart.c \
definitions.h \
config.h \
chart.h \
common.h \
image_file/image_file.h
common.o: common.c \
common.h
config.o: config.c \
config.h \
definitions.h \
common.h
image_file/image_file.o: image_file/image_file.c \
image_file/image_file.h
# Compillieren
$(OBJS):

View File

@ -25,23 +25,20 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include "definitions.h"
#include "config.h"
#include "chart.h"
#include "drawing/process_image.h"
#include "common.h"
#include "image_file/image_file.h"
static int walk_image_cfg_list();
static void wait_for_childs();
static void exit_sig_handler(int);
config global_opts;
static int walk_image_cfg_list(){
int has_forked = 0;
pid_t pid = 0;
@ -50,22 +47,26 @@ static int walk_image_cfg_list(){
for(; tmp_ptr; tmp_ptr = tmp_ptr->next){
if(global_opts.fork){
if((pid = fork()) == 0){
process_image(tmp_ptr->image_cfg_file);
clear_clean();
process_image_cfg(tmp_ptr->image_cfg_file);
exit(EXIT_SUCCESS);
}
else if (pid == -1){
exit_error(ERROR_FORK);
}
if(!has_forked){
add_clean(wait_for_childs, NULL);
}
has_forked++;
DEBUGOUT2("Prozess %d angelegt\n",pid);
} else {
process_image(tmp_ptr->image_cfg_file);
process_image_cfg(tmp_ptr->image_cfg_file);
}
}
return has_forked;
}
static void wait_for_childs(){
static void wait_for_childs(void *dummy){
int ret_val;
pid_t pid;
while((pid = wait(&ret_val)) != -1){
@ -73,7 +74,6 @@ static void wait_for_childs(){
}
}
int main(int argc, char *argv[]){
DEBUGOUT1("Programm gestartet\n");
@ -104,37 +104,9 @@ int main(int argc, char *argv[]){
DEBUGOUT2(" Datenbank = %s\n",global_opts.pg_database);
if(walk_image_cfg_list())
wait_for_childs();
wait_for_childs(NULL);
return EXIT_SUCCESS;
}
/* Diese Funktion beendet das Programm mit einer Fehlermeldung. */
void exit_error(char* err){
DEBUGOUT1("\nEtwas unschoenes ist passiert\n");
if(errno != 0){
perror("Fehler");
}
write(STDOUT_FILENO, err, strlen(err));
exit(1);
}
/* Wird bei Beendigungssignalen ausgefuehrt */
static void exit_sig_handler(int signr){
#ifdef DEBUG
DEBUGOUT1("\n");
switch (signr){
case SIGABRT:
DEBUGOUT1("SIGABRT Interupt erhalten!\n");
case SIGTERM:
DEBUGOUT1("SIGTERM Interupt erhalten!\n");
case SIGQUIT:
DEBUGOUT1("SIGQUIT Interupt erhalten!\n");
case SIGINT:
DEBUGOUT1("SIGINT Interupt erhalten!\n");
}
#endif
DEBUGOUT1("Beende Programm...\n");
exit(0);
}

View File

@ -20,27 +20,5 @@
*/
typedef struct image_cfg_list_t *image_cfg_list_ptr;
typedef struct image_cfg_list_t {
char *image_cfg_file;
image_cfg_list_ptr next;
} image_cfg_list;
typedef struct config_t {
char *pg_host;
char *pg_database;
char *pg_user;
char *pg_pass;
char *image_cfg_location;
image_cfg_list_ptr image_cfg;
int fork;
} config;
extern config global_opts;
/* Funktionen -------------------------------------------------------------*/
/* Programm mit einem Fatalem Fehler beenden.
* Argument: Fehlermeldung */
void exit_error(char*);

112
cronjob/chart/common.c Normal file
View File

@ -0,0 +1,112 @@
/*
common.c -- Part of Chart-generator for the weatherstation
Copyright (C) 2006 Jan Losinski
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <unistd.h> /* STDOUT_FILENO */
#include "common.h"
#include "definitions.h"
static void clean();
clean_struct_ptr clean_ptr = NULL;
/* Ein neues Clean-Element anfuegen. Ein Clean-Element ist eine Datenstruktur, die
* einen Pointer auf eine Funktion vom Typ
* void func(void *data),
* einen Zeiger auf beliebige Daten und einen Zeiger auf das naechste Element haelt.
* Die Funktionen werden beim regulaeren beenden des Programmes aufgerufen um zum bsp.
* datenbankverbindungen zu schließen, etc. */
void add_clean(clean_func_t func, void *data){
clean_struct_ptr temp = (clean_struct_ptr) malloc(sizeof(clean_data));
temp->data = data;
temp->func = func;
temp->next = NULL;
if(clean_ptr == NULL){
clean_ptr = temp;
} else {
temp->next = clean_ptr;
clean_ptr = temp;
}
}
void remove_clean(){
clean_struct_ptr temp = clean_ptr;
if (temp != NULL){
clean_ptr = temp->next;
free(temp);
}
}
void clear_clean(){
while(clean_ptr != NULL){
remove_clean();
}
}
/* 'Saeuberung' ausfuehren */
static void clean(){
DEBUGOUT1("\nRaeume auf...\n");
clean_struct_ptr p = clean_ptr;
while(p != NULL){
p->func(p->data);
p = p->next;
}
}
/* Diese Funktion beendet das Programm mit einer Fehlermeldung. */
void exit_error(char* err){
DEBUGOUT1("\nEtwas unschoenes ist passiert\n");
clean();
if(errno != 0){
perror("Fehler");
}
write(STDOUT_FILENO, err, strlen(err));
exit(1);
}
/* Wird bei Beendigungssignalen ausgefuehrt */
void exit_sig_handler(int signr){
#ifdef DEBUG
DEBUGOUT1("\n");
switch (signr){
case SIGABRT:
DEBUGOUT1("SIGABRT Interupt erhalten!\n");
case SIGTERM:
DEBUGOUT1("SIGTERM Interupt erhalten!\n");
case SIGQUIT:
DEBUGOUT1("SIGQUIT Interupt erhalten!\n");
case SIGINT:
DEBUGOUT1("SIGINT Interupt erhalten!\n");
}
#endif
clean();
DEBUGOUT1("Beende Programm...\n");
exit(0);
}

68
cronjob/chart/common.h Normal file
View File

@ -0,0 +1,68 @@
/*
common.h -- Part of Chart-generator for the weatherstation
Copyright (C) 2006 Jan Losinski
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
typedef struct image_cfg_list_t *image_cfg_list_ptr;
typedef struct image_cfg_list_t {
char *image_cfg_file;
image_cfg_list_ptr next;
} image_cfg_list;
typedef struct config_t {
char *pg_host;
char *pg_database;
char *pg_user;
char *pg_pass;
char *image_cfg_location;
image_cfg_list_ptr image_cfg;
int fork;
} config;
typedef void (*clean_func_t)(void *data);
typedef struct clean_struct *clean_struct_ptr;
typedef struct clean_struct {
void *data;
clean_func_t func;
clean_struct_ptr next;
} clean_data;
extern config global_opts;
/* Funktionen -------------------------------------------------------------*/
/* Programm mit einem Fatalem Fehler beenden.
* Argument: Fehlermeldung */
void exit_error(char*);
/* Signal-handler-Funktion zum beenden des Programmes */
void exit_sig_handler(int);
/* Eine (neuste) Clean-Funktion entfernen */
void remove_clean();
/* Eine Clean-Funktion hinzufügen */
void add_clean(clean_func_t , void *);
/* Alle clean-Funktionen entfernen */
void clear_clean();

View File

@ -32,7 +32,7 @@
#include "config.h"
#include "definitions.h"
#include "chart.h"
#include "common.h"
/* Funktionsdefinitionen */
static int read_int(const char *, void *);

View File

@ -21,9 +21,9 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include "process_image.h"
#include "image_file.h"
void process_image(char *image_cfg_file){
void process_image_cfg(char *image_cfg_file){
printf("%s\n",image_cfg_file);
sleep(3);
}

View File

@ -20,4 +20,4 @@
*/
void process_image(char *);
void process_image_cfg(char *);

View File

@ -1,23 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(){
int i;
pid_t p;
for(i=0; i<2; i++){
if((p = fork()) == 0){
sleep(10);
exit(0);
}
sleep(1);
printf("Process %i created\n",p);
}
while((p = wait(&i))!=-1){
printf("pid: %i\n",p);
}
printf("alle Prozesse beendet\n");
exit(0);
}