当前位置: 技术问答>linux和unix
求分析一个关于signal()的小程序
来源: 互联网 发布时间:2016-12-29
本文导语: 程序: #include #include #include int wait_mark; void waiting(),stop(); int main(int argc,char **argv) { int p1,p2; signal(SIGINT,stop); while((p1=fork())==-1); if(p1>0) { //(1) while((p2=fork())==-1); if(p2>0) { ...
程序:
#include
#include
#include
int wait_mark;
void waiting(),stop();
int main(int argc,char **argv)
{
int p1,p2;
signal(SIGINT,stop);
while((p1=fork())==-1);
if(p1>0)
{
//(1)
while((p2=fork())==-1);
if(p2>0)
{
// (2)
wait_mark=1;
waiting();
kill(p1,10);
kill(p2,12);
wait(NULL);
wait(NULL);
printf("parent process exit!n");
exit(0);
}
else
{
wait_mark=1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf("child process 2 is killed by parentn");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf("child process 1 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
分析:
1、如果把signal(SIGINT,stop)放到(1)和(2)位置时,相对应is else的else里面signal(12,stop),signal(10,stop)不在运行,为什么?(1)、(2)不都是主进程里吗?
2、为什么用两个wait(NULL);难道wait()不是等待所有子进程结束吗
3、每个程序段都用了exit(0);不用会怎么样?why?
#include
#include
#include
int wait_mark;
void waiting(),stop();
int main(int argc,char **argv)
{
int p1,p2;
signal(SIGINT,stop);
while((p1=fork())==-1);
if(p1>0)
{
//(1)
while((p2=fork())==-1);
if(p2>0)
{
// (2)
wait_mark=1;
waiting();
kill(p1,10);
kill(p2,12);
wait(NULL);
wait(NULL);
printf("parent process exit!n");
exit(0);
}
else
{
wait_mark=1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf("child process 2 is killed by parentn");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf("child process 1 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
分析:
1、如果把signal(SIGINT,stop)放到(1)和(2)位置时,相对应is else的else里面signal(12,stop),signal(10,stop)不在运行,为什么?(1)、(2)不都是主进程里吗?
2、为什么用两个wait(NULL);难道wait()不是等待所有子进程结束吗
3、每个程序段都用了exit(0);不用会怎么样?why?
|
1 子进程也需要注册SIGINT来结束waiting状态。
2 wait()是等待任意一个子进程结束。
3 第三个不确定,没有会造成僵尸进程?
2 wait()是等待任意一个子进程结束。
3 第三个不确定,没有会造成僵尸进程?
|
先回答你第三个
在你的程序中,如果没exit(0),如果在exit(0)之前出现异常,那么就可能造成所谓的僵尸进程
或者说,实际上进程已经退出了,但是在系统内核里面的那个进程表里面,你的进程ID还没有被删除,这样就会造成一定的泄漏
在你的程序中,如果没exit(0),如果在exit(0)之前出现异常,那么就可能造成所谓的僵尸进程
或者说,实际上进程已经退出了,但是在系统内核里面的那个进程表里面,你的进程ID还没有被删除,这样就会造成一定的泄漏