Du befindest dich hier: FSI Informatik » jahrgaenge » 2006 » "Muster"-Lösungen » "Muster"-Lösungen zu Klausuren aus Softwaresysteme 1 » Vordiplomsklausuren » September 2006
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
jahrgaenge:2006:loesungen:softwaresysteme_1:vordiplom:sep2006 [03.09.2007 14:49] – Airhardt | jahrgaenge:2006:loesungen:softwaresysteme_1:vordiplom:sep2006 [10.12.2008 06:33] (aktuell) – 83.171.166.47 | ||
---|---|---|---|
Zeile 23: | Zeile 23: | ||
<code c> | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | /* weiter Includes, Makros, Funktionsdeklarationen, | ||
+ | #define die(msg) {perror(msg); | ||
+ | |||
+ | static char *cmd[110]; | ||
+ | static int error = 0; | ||
+ | static int n_proc = 0; | ||
+ | static int max_proc; | ||
+ | |||
+ | int needcompile(char *cfile, char *ofile); | ||
+ | void pjob(char *cfile); | ||
+ | static void sigchld_handler(int sig); | ||
+ | |||
+ | /* Funktion main */ | ||
+ | int main(int argc, char **argv, char **envp) { | ||
+ | /* lokale variablen usw. */ | ||
+ | struct sigaction sa; | ||
+ | DIR *dir; | ||
+ | struct dirent *dirent; | ||
+ | int i = 3; | ||
+ | int status; | ||
+ | |||
+ | /* Aufrufargumente auswerten */ | ||
+ | if(argc != 3) { | ||
+ | fprintf(stderr, | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | |||
+ | cmd[0] = " | ||
+ | cmd[1] = " | ||
+ | cmd[2] = argv[1]; | ||
+ | |||
+ | max_proc = atoi(argv[2]); | ||
+ | |||
+ | |||
+ | if(sigisemptyset(& | ||
+ | sa.sa_flags = 0; | ||
+ | sa.sa_handler = sigchld_handler; | ||
+ | if(sigaction(SIGCHLD, | ||
+ | |||
+ | |||
+ | if((dir = opendir(" | ||
+ | |||
+ | while(1) { | ||
+ | int len; | ||
+ | char object[NAME_MAX+1]; | ||
+ | errno = 0; | ||
+ | |||
+ | if(error) break; | ||
+ | |||
+ | if((dirent = readdir(dir)) == NULL) { | ||
+ | if(errno == 0) break; | ||
+ | else { | ||
+ | perror(" | ||
+ | continue; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | len = strlen(dirent-> | ||
+ | if(!((dirent-> | ||
+ | continue; | ||
+ | | ||
+ | if((cmd[i] = malloc((NAME_MAX+1) * sizeof(char))) == NULL) die(" | ||
+ | |||
+ | strcpy(cmd[i], | ||
+ | strcpy(object, | ||
+ | object[dirent-> | ||
+ | if(needcompile(cmd[i], | ||
+ | pjob(cmd[i]); | ||
+ | } | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | /* warten bis alles fertig is ... */ | ||
+ | while(waitpid(-1, | ||
+ | |||
+ | cmd[i] = NULL; | ||
+ | |||
+ | execv("/ | ||
+ | return EXIT_FAILURE; | ||
+ | } | ||
+ | |||
+ | void pjob(char *cfile) { | ||
+ | char *comp[6]; | ||
+ | int pid; | ||
+ | sigset_t set; | ||
+ | sigset_t tmp; | ||
+ | |||
+ | |||
+ | sigemptyset(& | ||
+ | sigaddset(& | ||
+ | sigprocmask(SIG_BLOCK, | ||
+ | | ||
+ | /* Zu viele Prozesse? */ | ||
+ | while(n_proc >= max_proc) sigsuspend(& | ||
+ | | ||
+ | switch ((pid = fork())) { | ||
+ | case -1: | ||
+ | die(" | ||
+ | case 0: | ||
+ | comp[0] = " | ||
+ | comp[1] = " | ||
+ | comp[2] = cfile; | ||
+ | comp[3] = " | ||
+ | if((comp[4] = malloc((NAME_MAX+1) * sizeof(char))) == NULL) die(" | ||
+ | strcpy(comp[4], | ||
+ | comp[4][strlen(cfile)-1] = ' | ||
+ | comp[5] = NULL; | ||
+ | | ||
+ | execv("/ | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | n_proc++; | ||
+ | sigprocmask(SIG_UNBLOCK, | ||
+ | } | ||
+ | |||
+ | int needcompile(char *cfile, char *ofile) { | ||
+ | struct stat c; | ||
+ | struct stat o; | ||
+ | |||
+ | if(lstat(cfile, | ||
+ | if(lstat(ofile, | ||
+ | if(errno == ENOENT) return 1; | ||
+ | perror(" | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | if((int)c.st_mtime > (int)o.st_mtime) return 1; | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | static void sigchld_handler(int sig) { | ||
+ | int status; | ||
+ | int errno_save = errno; | ||
+ | |||
+ | while(waitpid(-1, | ||
+ | n_proc--; | ||
+ | if(status != 0) error = 1; | ||
+ | } | ||
+ | errno = errno_save; | ||
+ | } | ||
</ | </ | ||
* b) | * b) | ||
+ | < | ||
+ | # author: Noya, Sven Pfaller | ||
+ | |||
+ | .PHONY: clean | ||
+ | |||
+ | CFLAGS=-ansi -pedantic -Wall -Werror -D_POSIX_SOURCE -D_XOPEN_SOURCE=500 | ||
+ | |||
+ | pmake: pmake.c | ||
+ | gcc ${CFLAGS} -o pmake pmake.c | ||
+ | |||
+ | clean: | ||
+ | rm -f pmake.o pmake | ||
+ | |||
+ | </ | ||
==== Aufgabe 3 ==== | ==== Aufgabe 3 ==== | ||