/* ------------------------ sign.c ------------------------ */ # include "sign.h" # include # include # include struct sigaction ct_newact, ct_oldact, lm_newact, lm_oldact; siginfo_t info; long process = -1 ; int is_free = 1; int in_hand = 0; void lm_handler(int sig, siginfo_t * info){ /* second argument: Flag SA_SIGINFO, see man sigaction */ while (in_hand) sleep(1); in_hand = 1; /* printf("signal handler: SIGNAL = >%d<\n",sig); printf("Got from >%ld<\n", info->si_pid); */ if (is_free && (sig == SIGUSR1)) { is_free = 0; process = info-> si_pid; if (kill(info->si_pid,SIGUSR2) < 0 ) { perror("kill"); exit(1); } } else if ((process == info->si_pid) && (sig == SIGUSR2) ) { is_free = 1; process = -1; } in_hand = 0; return; } void ct_handler(int sig, siginfo_t * info){ /* second argument: Flag SA_SIGINFO, see man sigaction */ printf("signal handler: SIGNAL = >%d<\n",sig); printf("Got from >%ld<\n", info->si_pid); if( sig == SIGUSR2 ) return; } Sigfunc install_ct_sig(int sig) { ct_newact.sa_handler = ct_handler; if (sigemptyset(&ct_newact.sa_mask) < 0) return SIG_ERR; ct_newact.sa_flags = 0; ct_newact.sa_flags = SA_SIGINFO; /*SA_SIGINFO -> man sigaction */ if (sigaction(sig, &ct_newact, &ct_oldact) < 0) return SIG_ERR; else return ct_oldact.sa_handler; } Sigfunc install_lm_sig(int sig) { lm_newact.sa_handler = lm_handler; if (sigemptyset(&lm_newact.sa_mask) < 0) return SIG_ERR; sigaddset(&lm_newact.sa_mask, SIGUSR1); sigaddset(&lm_newact.sa_mask, SIGUSR2); lm_newact.sa_flags = 0; lm_newact.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; if (sigaction(sig, &lm_newact, &lm_oldact) < 0) return SIG_ERR; else return lm_oldact.sa_handler; }