【发布时间】:2014-02-13 18:38:45
【问题描述】:
sleep2的apue中代码如下:
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.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);
pause();
}
return (alarm(0));
}
int main(void)
{
while(1)
{
sleep2(1);
printf("test\n");
}
return 0;
}
代码的输出只是一个字符串“test”然后挂掉
据我了解,sleep2 函数的工作原理如下:
- jmp_buf env_alrm 设置为 0
- 程序第一次调用sleep2时,会调用
alarm(nsecs) - 在 nsecs 时,
sig_alrm将被调用,longjpm将 env_alrm 结构设置为 1 - 然后它跳转到
if(setjmp(env_alrm) == 0),虽然它不是真的,所以它运行语句return alarm(0)
在第二次调用 sleep2 时,struct jmp_buf env_alrm 的值为 1,因此不会调用 alrm(nsecs),在我看来,这就是导致功能无法正常工作的原因,所以我将代码更改为如下:
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.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);
}
alarm(nsecs);
if(setjmp(env_alrm) == 0)
{
pause();
}
return (alarm(0));
}
int main(void)
{
while(1)
{
sleep2(1);
printf("test\n");
}
return 0;
}
但是,第二个程序产生与第一个程序相同的输出,所以我的问题是:
是什么让这两个程序只打印一个“测试”然后挂起?
【问题讨论】: