#include #include #include #include #include #include #include // vorgegriffen, man benötigt bei sister nur SIG_IGN void handle_signal(int sig) { int errno_old = errno; const char str[] = "Hallo aus handle_signal\n"; write(STDOUT_FILENO, str, sizeof(str)); errno = errno_old; // nichts } void start_child() { pid_t pid = fork(); switch (pid) { case 0: // Fehlerbehandlung int fd = open("baz", O_RDONLY); // Fehlerbehandlung dup2(fd, STDIN_FILENO); execlp("cat", "cat", NULL); break; case -1: perror("fork"); break; default: // Elter break; } } int main() { struct sigaction act = { .sa_handler = handle_signal, }; sigaction(SIGUSR1, &act, NULL); while (1) { sigset_t set; sigemptyset(&set); sigsuspend(&set); printf("SIGUSR1. waiting 5 seconds\n"); sigset_t set2, old; sigemptyset(&set2); sigaddset(&set2, SIGINT); sigprocmask(SIG_BLOCK, &set2, &old); sleep(5); start_child(); // auch mit unblock möglich sigprocmask(SIG_SETMASK, &old, NULL); } }