/* 15May24: Dieses Programm führt ein Programm in vielen Prozessen * aus, jeweils gestartet mit nur einem Argument. Bspw.: * * $ ./list-run echo one two three * one * two * three */ #include #include #include #include /* Diese Datei benutzt eine Funktion aus einem anderem Modul. Wir * fügen hier den Header ein, damit der Compiler die Prototype der * Funktionen aus dem anderem Modul kennt. */ #include "exec1.h" static void run(char *cmd, char *arg) { /* Wenn ein Prozess erfolgreich erstellt werden konnte... */ pid_t pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } /* ...dann prüfen wir ob wir im Kind-Prozess sind... */ if (pid == 0) { /* Und wenn ja, versuchen wir den Programm im Prozess * auszuwechseln. Dazu benutze ich die Funktion aus dem * anderem Modul was wir in der TÜ programmiert haben, * normalerweise würde man auf execvp(2)/execlp(2) * zurückgreifen. */ exec1(cmd, arg); perror("waitpid"); exit(EXIT_FAILURE); } /* Im Eltern-Prozess wollen wir nur darauf warten, bis der neu * erstelle Prozess sich beendet hat. */ if (-1 == waitpid(pid, NULL, 0)) { perror("waitpid"); exit(EXIT_FAILURE); } } int main(int argc, char *argv[]) { for (int i = 2; i < argc; i++) { run(argv[1], argv[i]); } return 0; }