本文主要是介绍APUE学习笔记:10.15 函数sigsetjmp和siglongjmp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
输出
$ ./ctest &
[1] 7432
starting main: SIGQUIT
$ kill -USR1 7432
starting sig_usr1: SIGQUIT SIGUSR1
$ in sig_alrm: SIGQUIT SIGUSR1 SIGALRM
finishing sig_usr1: SIGQUIT SIGUSR1
ending main: SIGQUIT
#include <stdlib.h> #include <setjmp.h> #include <time.h> #include <signal.h> #include <apue.h>static void sig_usr1(int); static void sig_alrm(int); static sigjmp_buf jmpbuf; static volatile __sig_atomic_t canjump;int main(int argc,char **argv) {if(signal(SIGUSR1,sig_usr1) == SIG_ERR)err_sys("signal(SIGUSR1) error");if(signal(SIGALRM,sig_alrm) == SIG_ERR)err_sys("signal(SIGALRM) error");pr_mask("starting main: ");if(sigsetjmp(jmpbuf,1)){pr_mask("ending main: ");exit(0);}canjump = 1;for( ; ; ){pause();}exit(0); } static void sig_usr1(int signo){time_t start_time;if(canjump == 0)return;pr_mask("starting sig_usr1: ");alarm(3);start_time = time(NULL);for( ; ; )if(time(NULL) > start_time + 5)break;pr_mask("finishing sig_usr1: ");canjump = 0;siglongjmp(jmpbuf,1);} static void sig_alrm(int signo){pr_mask("in sig_alrm: "); }
这篇关于APUE学习笔记:10.15 函数sigsetjmp和siglongjmp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!