/***************************************************************************** * Systemprogrammierung I - Klausur vom Februar 2002 * * Datei: batchd.c * Autor: Goethe * Datum: 07.09.2005 *****************************************************************************/ #include #include #include #include /* Funktionsdeklarationen, globale Variablen */ #define MAX_PATH 1024 void sigusr_handler(int); int execute_job(char*); int run; /* Funktion main */ int main( int argc, char *argv[] ) { /* lokale Variablen und was man sonst am Anfang so braucht */ struct sigaction act; DIR *dir; struct dirent *entry; sigset_t set, emptyset; char pathname[MAX_PATH]; if( argc != 2 ) { fprintf( stderr, "usage: %s \n", argv[0] ); return -1; } sigemptyset(&set); sigemptyset(&emptyset); sigaddset(&set, SIGUSR1); strcpy( pathname, argv[1] ); strcat( pathname, "/" ); /* Signalbehandlung einrichten */ memset( &act, 0, sizeof(act) ); act.sa_handler = sigusr_handler; sigemptyset( &act.sa_mask); act.sa_flags = 0; if( sigaction( SIGUSR1, &act, NULL ) == -1 ) { perror( "Fehler beim Installieren des Signalhandlers" ); return -1; } /* Hauptschleife */ while(1) { sigprocmask( SIG_BLOCK, &set, NULL ); if( (dir = opendir(argv[1])) == NULL ) { perror( "Fehler beim Öffnen des Spool Verzeichnisses" ); return -1; } run = 0; while( (entry = readdir(dir)) != NULL ) { if( strlen(entry->d_name) < 2 || entry->d_name[0] != 'c' || entry->d_name[1] != 'f' ) continue; memcpy( pathname+strlen(argv[1])+1, entry->d_name, strlen(entry->d_name)+1 ); execute_job(pathname); run = 1; } closedir(dir); sigprocmask( SIG_UNBLOCK, &set, NULL ); while( !run ) sigsuspend(&emptyset); } return 0; } /* Ende Funktion main */ /* Signalhandler für SIGUSR1 */ void sigusr_handler(int sig) { run = 1; } /* Funktion execute_job */ int execute_job( char *filename ) { /* lokale Variablen etc. */ FILE *f; char cmd[MAX_PATH]; char *arguments[] = { cmd, NULL }; int pid; if( filename == NULL ) return -1; /* Datei öffnen, Kommando einlesen */ if( (f = fopen(filename, "r")) == NULL ) { fprintf( stderr, "Fehler beim Öffnen der Datei %s: %s\n", filename, strerror(errno) ); return -1; } fgets( cmd, MAX_PATH, f ); if( cmd[strlen(cmd)-1] == '\n' ) cmd[strlen(cmd)-1] = '\0'; fclose(f); unlink(filename); /* Prozess zur Kommandoausführung erzeugen */ pid = fork(); /* Fehler bei Prozesserzeugung */ if( pid == -1 ) { perror( "Fehler beim Erzeugen des Sohnprozesses" ); return -1; } /* Sohnprozess */ else if( pid == 0 ) { execvp( cmd, arguments ); perror( "Fehler beim Ausführen des Kommandos" ); return -1; } /* Vaterprozess */ else { wait(NULL); return 0; } } /* Ende Funktion main */