请教关于setjmp和longjmp的问题
时间:2010-09-07
来源:互联网
APUE中如下一段程序:
复制代码
请问,当执行pause函数之前执行了signal的话,跳入setjmp设置的位置将如何执行?不是继续循环么?为什么apue中说即使pause一次都没有执行,该函数仍然会返回结束?此处很是疑惑~请高人解答~谢谢
- #include <setjmp.h>
- #include <signal.h>
- #include <unistd.h>
-
- static jmp_buf env_alrm;
-
- static void
- sig_alrm(int signo)
- {
- longjmp(env_alrm, 1);
- }
-
- unsigned int
- sleep2(unsigned int nsecs)
- {
- if (signal(SIGALRM, sig_alrm) == SIG_ERR)
- return(nsecs);
- if (setjmp(env_alrm) == 0) {
- alarm(nsecs); /* start the timer */
- pause(); /* next caught signal wakes us up */
- }
- return(alarm(0)); /* turn off timer, return unslept time */
- }
作者: blackgenius 发布时间: 2010-09-07
如果看书时发现有看不懂的文字,先别急着责备自己,建议先找英文原版对照一下 
另:这段代码没什么价值,在BSD系统上肯定能通过。其他系统下不保证正确。

另:这段代码没什么价值,在BSD系统上肯定能通过。其他系统下不保证正确。
作者: JohnBull 发布时间: 2010-09-08
看来你对setjmp的返回值不是很清楚。
当从longjmp(env_alrm, 1)跳转到setjmp时,setjmp的返回值是1
这样if (setjmp(env_alrm) == 0)的条件就为假,pause就执行不到了。
当从longjmp(env_alrm, 1)跳转到setjmp时,setjmp的返回值是1
这样if (setjmp(env_alrm) == 0)的条件就为假,pause就执行不到了。
作者: insnowind 发布时间: 2010-09-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28