sigsetjmp()与siglongjmp()
2017-03-27 18:34
1731 查看
使用sigsetjmp()与siglongjmp()
int sigsetjmp(sigjmp_buf env, int savesigs);
void siglongjmp(sigjmp_buf env, int val);
解决竞态问题的另一个办法: 从信号函数中调用siglongjmp().siglongjmp() 作用: 局部跳转,使用它可以从一个函数跳至另一个函数.
使用sigsetjmp(), 建立跳转缓冲区.
第一个参数: 当前程序环境变量; 第二个为非0 时, 标识: 保存当前的信号集, 非0, 标识: 标识不保存当前信号集.
返回值: 设置跳转缓冲区时, 返回值为 0; 当调用siglongjmp()后, 返回值为 siglongjmp() 的第二个参数, 注意: 该参数必须为非0值
void sig_alarm(int sig) { myprint("The func sig_alarm() is %d", sig); siglongjmp(env, 2); } void test() { int ret = 0, i = 0; signal(SIGALRM, sig_alarm); alarm(5); while(1) { ret = sigsetjmp(env, 1); if(ret) { myprint("siglongjmp() callback OK, ret = %d", ret); } myprint("The loop is : %d", i++); sleep(2); } } 输出内容为: The loop is : 0 [42], [siglongjmp_sigsetjmp.c] The loop is : 1 [42], [siglongjmp_sigsetjmp.c] The loop is : 2 [42], [siglongjmp_sigsetjmp.c] The func sig_alarm() is 14 [22], [siglongjmp_sigsetjmp.c] siglongjmp() callback OK, ret = 2 [39], [siglongjmp_sigsetjmp.c] The loop is : 3 [42], [siglongjmp_sigsetjmp.c] The loop is : 4 [42], [siglongjmp_sigsetjmp.c] The loop is : 5 [42], [siglongjmp_sigsetjmp.c] The loop is : 6 [42], [siglongjmp_sigsetjmp.c] The loop is : 7 [42], [siglongjmp_sigsetjmp.c] ...
Linux 与进程ID有关的函数 ;
pid_t getpid(void); //获取被调进程的ID;pid_t getppid(void); //获取被调进程父进程的ID;
相关文章推荐
- sigsetjmp, siglongjmp
- APUE学习笔记——10.15 sigsetjmp和siglongjmp
- sigsetjmp,siglongjmp的使用
- sigsetjmp,siglongjmp的使用
- 函数 setjmp, longjmp, sigsetjmp, siglongjmp
- csapp读书笔记-使用setjmp/sigsetjmp和longjmp/siglongjmp进行非本地跳转
- sigsetjmp,siglongjmp的使用
- 用sigsetjmp和siglongjmp 解决从信号处理程序返回后信号仍被屏蔽问题
- 函数setjmp,longjmp和sigsetjmp,siglongjmp
- Linux Signal (8): sigsetjmp和siglongjmp
- 《unix环境高级编程》信号——sigsetjmp 函数和 siglongjmp 函数
- 信号处理函数的返回sigsetjmp/siglongjmp
- 关于sigsetjmp,siglongjmp注意点 (UDP超时重传应用)
- C语言中的跳转goto&&setjmp&&longjmp sigsetjmp siglongjmp
- Sigsetjmp 和 Siglongjmp
- sigsetjmp,siglongjmp的使用
- Linux Signal (8): sigsetjmp和siglongjmp
- siglongjmp、sigsetjmp
- sigsetjmp & siglongjmp
- siglongjmp 和 sigsetjmp 用法