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
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
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
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
#include <stdio.h>
#include <string.h>
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, " ");
}
}