#include #include // Wie in den Folien: eine (volatile!) event-Variable, um der main-Funktion zu // signalisieren, dass SIGUSR1 angekommen ist. static volatile int event = 0; static void handle_usr1(int _) { event = 1; } // Das Senden von SIGUSR1 geht z.B. in der Shell mit: // kill -USR1 // killall -USR1 03-wait-sigusr1 int main() { struct sigaction act = { .sa_handler = handle_usr1, // Durch "SA_RESTART" werden unterbrochene Systemaufrufe automatisch neu // gestartet. Ist hier eigentlich nicht notwendig, aber eventuell fuer // die rush ganz nuetzlich... ;) .sa_flags = SA_RESTART }; // Da wir eine explizite Signalbehandlungsfunktion haben, muessen wir auch // noch das Feld sa_mask setzen, da dort sonst eventuell ein sinnloser Wert // drinsteht. sigemptyset(&act.sa_mask); sigaction(SIGUSR1, &act, NULL); printf("waiting for SIGUSR1...\n"); sigset_t set, oldset; sigemptyset(&set); sigaddset(&set, SIGUSR1); // Hier ginge auch "SIG_SETMASK". sigprocmask(SIG_BLOCK, &set, &oldset); // Entspricht BLOCK_SIGNAL. while (event == 0) { sigsuspend(&oldset); // Entspricht UNBLOCK_SIGNAL + SUSPEND // + BLOCK_SIGNAL. } // Mit "SIG_UNBLOCK" wuerde es grundsaetzlich auch funktionieren, aber mit // "SIG_SETMASK" ist es im Allgemeinen besser/sicherer. sigprocmask(SIG_SETMASK, &oldset, NULL); // Entspricht UNBLOCK_SIGNAL. printf("got it!\n"); }