在APUE SLEEP2的代碼如下: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;
}
代碼的輸出僅僅是一個字符串「測試」,然後掛斷
據我瞭解,SLEEP2功能的工作原理如下:
- jmp_buf env_alrm被設置爲0
- 當在第一時間程序調用SLEEP2,所述
alarm(nsecs)
將被稱爲 - 在納秒的時間內,
sig_alrm
將被調用,longjpm
設置env_alrm結構爲1 - 然後跳轉到
if(setjmp(env_alrm) == 0)
,而事實並非如此,所以它在運行的語句return alarm(0)
當SLEEP2被稱爲第二次,結構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;
}
然而,第二個程序會產生與第一個程序相同的輸出,所以我的問題是:
什麼使兩個程序只打印一個「測試」然後掛起?