Linux-信号机制
/* * @ zwp
*/ #include <sys/types.h> #include <sys/stat.h> #include <signal.h> #include <setjmp.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> static void sig_usr1(int), sig_alrm(int); static sigjmp_buf jmpbuf; static volatile sig_atomic_t canjump; int main(int argc, char* agv[]) { if(signal(SIGUSR1, sig_usr1) == SIG_ERR) printf("signal (SIGUSR1) error...\n"); if(signal(SIGALRM, sig_alrm) == SIG_ERR) printf("signal (SIGALRM) error....\n"); pr_mask("starting main: "); if(sigsetjmp(jmpbuf, 1)) { pr_mask("ending main: "); exit(0); } canjump = 1; for(; ;) pause(); } static void sig_usr1(int signo) { time_t starttime; if(canjump == 0) return ; pr_mask("starting sig_usr1: "); alarm(3); starttime = time(NULL); for(; ;) if(time(NULL) > starttime + 5) break; pr_mask("finishing sig_usr1: "); canjump = 0; siglongjmp(jmpbuf, 1); } static void sig_alrm(int signo) { pr_mask("in sig_alrm: "); return ; } void pr_mask(const char *str) { sigset_t sigset; int errno_save; errno_save = errno; if(sigprocmask(0, NULL, &sigset) < 0) printf("sigprocmask error...\n"); printf("%s", str); if(sigismember(&sigset, SIGINT)) printf("SIGINT "); if(sigismember(&sigset, SIGQUIT)) printf("SIGQUIT "); if(sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 "); if(sigismember(&sigset, SIGALRM)) printf("SIGALRM "); printf("\n"); errno = errno_save; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。