#include #include #include #include #include // pro zapamatovani, jestli signal prisel nebo ne... volatile sig_atomic_t usr_interrupt = 0; void synch_signal(int sig) { usr_interrupt = 1; } void child_function(int stav) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask,SIGUSR1); printf("potomek\n"); kill(getppid(),SIGUSR1); printf("po signalu\n"); sigsuspend(&mask); printf("po zotavenis\n"); exit(EXIT_SUCCESS); } int main(void) { struct sigaction usr_action; sigset_t block_mask, old_mask; int stav; sigfillset(&block_mask); usr_action.sa_handler = synch_signal; usr_action.sa_mask = block_mask; usr_action.sa_flags = 0; sigaction (SIGUSR1, &usr_action, NULL); stav = fork(); if(stav == 0) child_function(2); sigemptyset(&block_mask); sigaddset(&block_mask,SIGUSR1); sigprocmask(SIG_BLOCK, &block_mask, &old_mask); printf("cekam\n"); while(!usr_interrupt) { sigsuspend(&old_mask); } printf("docekal sem\n"); sigprocmask(SIG_UNBLOCK, &block_mask, NULL); kill(stav,SIGUSR1); return(EXIT_SUCCESS); }