#include <signal.h>#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>// 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() { printf("sem v potomkovi\n"); kill(getpid(),SIGUSR1); printf("vyskakuju\n"); exit(EXIT_SUCCESS);}int main(void) { struct sigaction usr_action; sigset_t block_mask, old_mask; int stav; // zablokujeme vsecny signaly sigfillset(&block_mask); // k obsluze signalu se ma pouzit tato fce.... usr_action.sa_handler = synch_signal; // nastavime do struktury jako masku, ktera se ma pouzit pri obsluze siganlu... usr_action.sa_mask = block_mask; // nenastavujeme zadne dalsi zvlastni przinaky usr_action.sa_flags = 0; // aktivujeme prednastavenou obsluhu ^ pro signal SIGUSR1...je popsana ve strukture usr_action // NULL == nezajima me jake bylo nastaveni predtim... sigaction (SIGUSR1, &usr_action, NULL); // vytvoreni potomka (jeste vetev kdy fork vraci -1 == chyba...) // musi na konci fce potmka byt exit, jinak probehne fci a zacna provadet kod dole... // kdyz fork nevrati nulu, tak se podarilo spustit potomka ale aktualne sme v rodici.... printf("vytvarim potomka\n"); stav = fork(); if(stav == 0) child_function(); else if(stav == -1) printf("nelze vytvorit potomka..."); printf("potomek dodelanej...\n"); // rodic se pripravi na cekani na signal od potomka, pripravi si masku kterou pouzije PREDTIM // nez zacne cekat, ve ktery je SIGUSR1 sigemptyset(&block_mask); sigaddset(&block_mask,SIGUSR1); // zablokuj to co je zablokovano plus navic SIGUSR1 a zaroven si uchova jaky blokovani bylo predtim v old_mask // pokud potomek posle signal, bude zapaamtovan, ale nebude dorucen.. sigprocmask(SIG_BLOCK, &block_mask, &old_mask); //byl uz dorucen signal?? // pokud byl dorucen jeste predtim nez sme ho zablokovali, tak cylus preskocime a pokracujeme dal // a vime ze signal je zpracovan... printf("zacinam cekat\n"); while(!usr_interrupt) { printf("cekam na signal\n"); // cekame na zaslani signalu.... behem cekani nastavuji masku na old_mask // coz je maska ktera byla aktivni predtim == odblokuju signal SIGUSR1 na kterej ted cekam... //usr_interrupt = 1; sigsuspend(&old_mask); } printf("konci cekani...\n"); // vypadne z cekani a nastavi se zase blokovani SIGUSR1 sigprocmask(SIG_UNBLOCK, &block_mask, NULL); return(EXIT_SUCCESS);}