+ -
当前位置:首页 → 问答吧 → 请教关于setjmp和longjmp的问题

请教关于setjmp和longjmp的问题

时间:2010-09-07

来源:互联网

APUE中如下一段程序:
  1. #include        <setjmp.h>
  2. #include        <signal.h>
  3. #include        <unistd.h>

  4. static jmp_buf  env_alrm;

  5. static void
  6. sig_alrm(int signo)
  7. {
  8.         longjmp(env_alrm, 1);
  9. }

  10. unsigned int
  11. sleep2(unsigned int nsecs)
  12. {
  13.         if (signal(SIGALRM, sig_alrm) == SIG_ERR)
  14.                 return(nsecs);
  15.         if (setjmp(env_alrm) == 0) {
  16.                 alarm(nsecs);           /* start the timer */
  17.                 pause();                        /* next caught signal wakes us up */
  18.         }
  19.         return(alarm(0));               /* turn off timer, return unslept time */
  20. }
复制代码
请问,当执行pause函数之前执行了signal的话,跳入setjmp设置的位置将如何执行?不是继续循环么?为什么apue中说即使pause一次都没有执行,该函数仍然会返回结束?此处很是疑惑~请高人解答~谢谢

作者: blackgenius   发布时间: 2010-09-07

如果看书时发现有看不懂的文字,先别急着责备自己,建议先找英文原版对照一下  

另:这段代码没什么价值,在BSD系统上肯定能通过。其他系统下不保证正确。

作者: JohnBull   发布时间: 2010-09-08

看来你对setjmp的返回值不是很清楚。
当从longjmp(env_alrm, 1)跳转到setjmp时,setjmp的返回值是1
这样if (setjmp(env_alrm) == 0)的条件就为假,pause就执行不到了。

作者: insnowind   发布时间: 2010-09-08

相关阅读 更多

热门下载

更多