--- title: "Übung 03 - Prozesse" layout: "blog-post.njk" tags: "sp1-lesson" date: 2025-05-19 --- ### waitpid() Mit `waitpid()` können Informationen über den Exitstatus eines Kindprozesses abgefragt werden. By default wartet waitpid, bis das angegebene Kind terminiert. Falls das nicht gewünscht ist, kann options=WNOHANG als Argument von waitpid() angegeben werden. ## Beispiel Programme aus der Präsenzübung ### `listRun.c`: Übergebenes Programm mehrfach mit verschiedenen Argumenten aufrufen ```c #include #include #include #include int main(int argc, char *argv[]) { if (argc < 3) { exit(EXIT_FAILURE); } char *command = argv[1]; for (int i = 2; i < argc; i++) { pid_t pid = fork(); if (pid == -1) { // Fehler perror("fork"); exit(EXIT_FAILURE); } else if (pid == 0) { // Child if (execlp(command, command, argv[i], NULL) == -1) { perror("execlp"); } exit(EXIT_FAILURE); } else { // Parent (pid == child's pid) int status; waitpid(pid, &status, 0); // ... waitpid Fehlerbehandlung if (WIFEXITED(status)) { fprintf(stderr, "Exitstatus: %d\n", WEXITSTATUS(status)); // ... fprintf Fehlerbehandlung } } } } ``` ### Makefile für `listRun.c` ```Makefile CC=gcc CFLAGS=-std=c11 -pedantic -Wall -Werror -fsanitize=undefined -fno-sanitize-recover -g -D_XOPEN_SOURCE=700 all: listRun listRun: listRun.o $(CC) $(CFLAGS) -o listRun listRun.o listRun.o: listRun.c $(CC) $(CFLAGS) -o listRun.o -c listRun.c clean: rm -rf listRun listRun.o .PHONY: all clean ``` ### strtok-test ```c #include #include int main(int argc, char *argv[]) { char str[] = "hello world"; // auf dem stack, damit schreibbar char *token; token = strtok(str, " "); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); } } ```