📄 p8-15.c
字号:
#include <signal.h>#include <setjmp.h>#include <stdio.h>#include "err_exit.h"static void sig_usr1(int),sig_alrm();static sigjmp_buf jmpbuf;static volatile sig_atomic_t canjmp;static int sigalrm_appear;void pr_mask(const char *);int main(void){ if(signal(SIGUSR1,sig_usr1) == SIG_ERR) err_exit("signal(SIGUSR1) error"); if(signal(SIGALRM,sig_alrm) == SIG_ERR) err_exit("signal(SIGALRM) error"); printf("starting main: \n"); if(sigsetjmp(jmpbuf,1)){ pr_mask("ending main: "); exit(EXIT_SUCCESS); } canjmp = 1; /* sigsetjmp() 已被调用过 */ for(;;) pause(); /* 等待信号 */}static void sig_usr1(int signo){ time_t startime; if(canjmp == 0) return; /* 不期望的信号,忽略*/ pr_mask("starting sig_usr1: "); alarm(3); /* 3秒之后生成SIGALRM信号 */ while(!sigalrm_appear); /* 等待SIGALRM */ pr_mask("finishing sig_usr1:"); canjmp = 0; siglongjmp(jmpbuf,1); /* 跳回到main,不返回 */}static void sig_alrm(int signo){ pr_mask("in sig_alrm: "); sigalrm_appear = 1; return;}void pr_mask(const char *str){ sigset_t sigset; int i, errno_save; errno_save = errno; if (sigprocmask(0,NULL,&sigset) < 0) err_exit("sigprocmask error"); printf(" %s\n",str); fflush(stdout); for(i = 1; i < NSIG; i++) if(sigismember(&sigset,i)) psignal(i," "); printf("\n"); errno = errno_save;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -