当前位置: 技术问答>linux和unix
关于Linux信号捕捉的问题,哪位高手帮我看看,谢谢。
来源: 互联网 发布时间:2016-11-26
本文导语: 执行结果为: [root@localhost heiying]# ./a.out receive signal 14 [root@localhost heiying]# 问题: 虽然捕捉到了SIGALRM这个信号,但是程序还是被这个型号 终止了(2秒之后),要如何修改程序才能让这个程序的sleep(1000)的到执...
执行结果为:
[root@localhost heiying]# ./a.out
receive signal 14
[root@localhost heiying]#
问题:
虽然捕捉到了SIGALRM这个信号,但是程序还是被这个型号
终止了(2秒之后),要如何修改程序才能让这个程序的sleep(1000)的到执行呢 ?????????????
原文件:
#include
#include
#include
#include
#include
#include
#include
void new_op(int signum, siginfo_t *info, void *myact)
{
printf("receive signal %dn",signum);
}
int main()
{
int sig=SIGALRM;
struct sigaction act;
alarm(2); //闹钟:2秒后发送SIGALRM信号,如果不捕捉,则系统的默认动作时终止该进程。
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;
sigaction(sig,&act,NULL);
sleep(1000);
return 0;
}
[root@localhost heiying]# ./a.out
receive signal 14
[root@localhost heiying]#
问题:
虽然捕捉到了SIGALRM这个信号,但是程序还是被这个型号
终止了(2秒之后),要如何修改程序才能让这个程序的sleep(1000)的到执行呢 ?????????????
原文件:
#include
#include
#include
#include
#include
#include
#include
void new_op(int signum, siginfo_t *info, void *myact)
{
printf("receive signal %dn",signum);
}
int main()
{
int sig=SIGALRM;
struct sigaction act;
alarm(2); //闹钟:2秒后发送SIGALRM信号,如果不捕捉,则系统的默认动作时终止该进程。
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;
sigaction(sig,&act,NULL);
sleep(1000);
return 0;
}
|
int main()
{
int sig=SIGALRM;
struct sigaction act;
alarm(2); //闹钟:2秒后发送SIGALRM信号,如果不捕捉,则系统的默认动作时终止该进程。
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;
sigaction(sig,&act,NULL);
sleep(1000);
其实你的程序不是被SIGALRM终止的,是由于return 0正常终止的,这个你可以通过shell命令上面查看进程的终止原因。至于原因:sleep(1000)收到信号后会从内核态返回,执行信号句柄后继续向后执行,而你可能认为sleep(1000)要睡1000s后才会向后继续执行
return 0;
}
{
int sig=SIGALRM;
struct sigaction act;
alarm(2); //闹钟:2秒后发送SIGALRM信号,如果不捕捉,则系统的默认动作时终止该进程。
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;
sigaction(sig,&act,NULL);
sleep(1000);
其实你的程序不是被SIGALRM终止的,是由于return 0正常终止的,这个你可以通过shell命令上面查看进程的终止原因。至于原因:sleep(1000)收到信号后会从内核态返回,执行信号句柄后继续向后执行,而你可能认为sleep(1000)要睡1000s后才会向后继续执行
return 0;
}
|
对,sleep(1000)被ALRM信号中断了,从而执行最后的return,程序结束。
你可以判断sleep()的返回值,如果>0,表示剩余的待睡眠的秒数,可以继续sleep
int n;
do
{
n = sleep(1000);
}
while( n > 0 );
你可以判断sleep()的返回值,如果>0,表示剩余的待睡眠的秒数,可以继续sleep
int n;
do
{
n = sleep(1000);
}
while( n > 0 );