当前位置: 技术问答>linux和unix
signal()函数捕捉信号问题,有程序
来源: 互联网 发布时间:2015-11-12
本文导语: 看一下程序,有那位高手能解释一下它的运行情况 #include #include #include #include static void sig_do(int signo); int main(void) { if(fork() == 0) { while(1) { sleep(2); printf("hellon"); } exit(0); } else { printf("waitting for ch...
看一下程序,有那位高手能解释一下它的运行情况
#include
#include
#include
#include
static void sig_do(int signo);
int main(void)
{
if(fork() == 0)
{
while(1)
{
sleep(2);
printf("hellon");
}
exit(0);
}
else
{
printf("waitting for child ....n");
signal(SIGCHLD, sig_do);
pause();
exit(0);
}
}
static void sig_do(int signo)
{
int status, i;
int pid,t_pid;
pid = wait(&status);
printf("exit childpid %dn", pid);
}
运行情况:
[root@jbnetwork Desktop]# ./signal
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
另一个终端 [root@jbnetwork ~]# kill -STOP 3098 //向子程序发送暂停的信号
程序暂停不运行了
然后,[root@jbnetwork ~]# kill -CONT 3098 //向子程序发送继续运行的信号
[root@jbnetwork Desktop]# ./signal
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
程序又继续运行了
最后,[root@jbnetwork ~]# kill -KILL 3098 //向子程序发送强制杀死的信号
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
exit childpid 3098
exit childpid -1 // 这里我不能理解,按照结果的话,子程序结束的时候向父程序发送了两个信号
[1]+ 已杀死 ./signal
[root@jbnetwork Desktop]#
#include
#include
#include
#include
static void sig_do(int signo);
int main(void)
{
if(fork() == 0)
{
while(1)
{
sleep(2);
printf("hellon");
}
exit(0);
}
else
{
printf("waitting for child ....n");
signal(SIGCHLD, sig_do);
pause();
exit(0);
}
}
static void sig_do(int signo)
{
int status, i;
int pid,t_pid;
pid = wait(&status);
printf("exit childpid %dn", pid);
}
运行情况:
[root@jbnetwork Desktop]# ./signal
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
另一个终端 [root@jbnetwork ~]# kill -STOP 3098 //向子程序发送暂停的信号
程序暂停不运行了
然后,[root@jbnetwork ~]# kill -CONT 3098 //向子程序发送继续运行的信号
[root@jbnetwork Desktop]# ./signal
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
程序又继续运行了
最后,[root@jbnetwork ~]# kill -KILL 3098 //向子程序发送强制杀死的信号
waitting for child ....
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
exit childpid 3098
exit childpid -1 // 这里我不能理解,按照结果的话,子程序结束的时候向父程序发送了两个信号
[1]+ 已杀死 ./signal
[root@jbnetwork Desktop]#
|
可以,用waitpid(pid_t pid, int * static, int options),将options设为WNOHAND