/* 20Nov23: Beispiel für Syncrhonisation zwischen Hauptprogramm und * Signalbehandlung. Per default wird es richtig bauen, aber mit * "-DWITHOUT_SIGPROCMASK" Argument zu GCC kann man die schlecht * synchronisierte Version ausprobieren. */ #include #include #include #include static int lives = 30000; static void handler() { /* Hier kein printf, siehe signal-safety(7) */ lives--; } int main() { sigset_t no_sigchld, initial; sigemptyset(&no_sigchld); sigaddset(&no_sigchld, SIGCHLD); sigprocmask(SIG_BLOCK, &no_sigchld, &initial); /* FEHLERBEHANDLUNG! */ sigaction(SIGCHLD, &(struct sigaction){.sa_handler = handler}, NULL); /* FEHLERBEHANDLUNG! */ while (lives > 0) { #ifndef WITHOUT_SIGPROCMASK printf("zzz: %d\n", lives); sigsuspend(&initial); /* FEHLERBEHANDLUNG! */ printf("wake up: %d\n", lives); #else sigprocmask(SIG_SETMASK, &initial, &no_sigchld); printf("zzz: %d\n", lives); pause(); printf("wake up: %d\n", lives); sigprocmask(SIG_SETMASK, &no_sigchld, &initial); #endif } sigprocmask(SIG_SETMASK, &initial, NULL); return 0; }