当前位置: 技术问答>linux和unix
请问为什么alarm失去作用?
来源: 互联网 发布时间:2015-10-23
本文导语: #include #include #include void do_signal(); sigjmp_buf timeoutbuf; int main() { signal(SIGALRM, do_signal); (void)setjmp(timeoutbuf); printf("hello worldn"); // setjmp(timeoutbuf); al...
#include
#include
#include
void do_signal();
sigjmp_buf timeoutbuf;
int main() {
signal(SIGALRM, do_signal);
(void)setjmp(timeoutbuf);
printf("hello worldn");
// setjmp(timeoutbuf);
alarm(3);
while(1) {
;
}
return 0;
}
void do_signal(int s) {
printf("do_signal: got signal = %dn", s);
alarm(0);
longjmp(timeoutbuf, 1);
}
这段代码的本意是想不断产生SIGALRM信号,但是只能产生一次sigalrm,不知道为什么?
#include
#include
void do_signal();
sigjmp_buf timeoutbuf;
int main() {
signal(SIGALRM, do_signal);
(void)setjmp(timeoutbuf);
printf("hello worldn");
// setjmp(timeoutbuf);
alarm(3);
while(1) {
;
}
return 0;
}
void do_signal(int s) {
printf("do_signal: got signal = %dn", s);
alarm(0);
longjmp(timeoutbuf, 1);
}
这段代码的本意是想不断产生SIGALRM信号,但是只能产生一次sigalrm,不知道为什么?
|
int main() {
signal(SIGALRM, do_signal);
sigsetjmp(timeoutbuf,SIGALRM);
printf("hellon");
alarm(3);
while(1) {
;
}
return 0;
}
void do_signal(int s) {
printf("do_signal: got signal = %dn", s);
//alarm(3);
siglongjmp(timeoutbuf, 1);
}
signal(SIGALRM, do_signal);
sigsetjmp(timeoutbuf,SIGALRM);
printf("hellon");
alarm(3);
while(1) {
;
}
return 0;
}
void do_signal(int s) {
printf("do_signal: got signal = %dn", s);
//alarm(3);
siglongjmp(timeoutbuf, 1);
}
|
你用的是什么系统?好像setjmp/longjmp默认的语义上面有问题,没有保存signal mask……
看看你的系统有没有_setjmp/_longjmp以及他们的描述。
不行的话就改用sigsetjmp/siglongjmp,并且给sigsetjmp第二个参数传递非0
看看你的系统有没有_setjmp/_longjmp以及他们的描述。
不行的话就改用sigsetjmp/siglongjmp,并且给sigsetjmp第二个参数传递非0
|
void do_signal(int s) {
printf("do_signal: got signal = %dn", s);
alarm(0);
signal(SIGALRM, do_signal);
longjmp(timeoutbuf, 1);
}
printf("do_signal: got signal = %dn", s);
alarm(0);
signal(SIGALRM, do_signal);
longjmp(timeoutbuf, 1);
}