All pastes #461269 Raw Edit

Miscellany

public c v1 · immutable
#461269 ·published 2007-04-27 16:31 UTC
rendered paste body
#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);}