当前位置: 技术问答>linux和unix
信号传递问题,详情麻烦进来看~!
来源: 互联网 发布时间:2016-02-21
本文导语: 父进程创建两个子进程,每个子进程用signal设置中断信号,等待父进程发送信号。父进程在接到键盘上的Ctrl+Z后向子进程发信号,两个子进程收到信号后分别执行handler1和handler2 代码如下: #include #include #include #includ...
父进程创建两个子进程,每个子进程用signal设置中断信号,等待父进程发送信号。父进程在接到键盘上的Ctrl+Z后向子进程发信号,两个子进程收到信号后分别执行handler1和handler2
代码如下:
#include
#include
#include
#include
#include
pid_t p1,p2;//子进程的pid号
void handler()
{
kill(p1,16);
wait(0);
kill(p2,SIGINT);
wait(0);
return;
}
void handler1()
{
printf("Child process1 is Killed by Parent!n");
return;
}
void handler2()
{
printf("Child process2 is Killed by Parent!n");
return;
}
main()
{
while((p1=fork())==-1);//创建子进程1
if(p1==0)
{
printf("The pid of child 1 is:%dn",p1=getpid());
signal(16,handler1);
sleep(5);
}
else
{
while((p2=fork())==-1);//创建子进程2
if(p2==0)
{
printf("The pid of child 2 is:%dn",p2=getpid());
signal(SIGINT,handler2);
sleep(5);
}
else
{
printf("The pid of father is:%dn",getpid());
printf("waiting command...n");
signal(20,handler);//父进程设置信号量,等待键盘输入
pause();//键盘输入ctrl+z后,执行handler
printf("Parent is Killed !n");
}
}
}
按Ctrl+Z后没反应,貌似kill都没有执行。不知道是什么原因?大家帮忙看看。。。谢谢了。。
代码如下:
#include
#include
#include
#include
#include
pid_t p1,p2;//子进程的pid号
void handler()
{
kill(p1,16);
wait(0);
kill(p2,SIGINT);
wait(0);
return;
}
void handler1()
{
printf("Child process1 is Killed by Parent!n");
return;
}
void handler2()
{
printf("Child process2 is Killed by Parent!n");
return;
}
main()
{
while((p1=fork())==-1);//创建子进程1
if(p1==0)
{
printf("The pid of child 1 is:%dn",p1=getpid());
signal(16,handler1);
sleep(5);
}
else
{
while((p2=fork())==-1);//创建子进程2
if(p2==0)
{
printf("The pid of child 2 is:%dn",p2=getpid());
signal(SIGINT,handler2);
sleep(5);
}
else
{
printf("The pid of father is:%dn",getpid());
printf("waiting command...n");
signal(20,handler);//父进程设置信号量,等待键盘输入
pause();//键盘输入ctrl+z后,执行handler
printf("Parent is Killed !n");
}
}
}
按Ctrl+Z后没反应,貌似kill都没有执行。不知道是什么原因?大家帮忙看看。。。谢谢了。。
|
这样的,由父进程创建的子进程,如果没有特别设置,是和父进程处于同一个进程组的,由控制终端按键产生的信号,会同时发送给这个进程组内的每个进程的.再则,你在子进程能sleep内是用的sleep(5),这样也可能产生,还没等到你按键,子进程就已经退处的情况.
你把
signal(16,handler1);
sleep(5);
signal(SIGINT,handler2);
sleep(5);
换成
signal(16,handler1);
setsid(); //设置进程的进程组为以新进程组,该进程为进程组长.
pause();
signal(SIGINT,handler2);
setsid();
pause();
你把
signal(16,handler1);
sleep(5);
signal(SIGINT,handler2);
sleep(5);
换成
signal(16,handler1);
setsid(); //设置进程的进程组为以新进程组,该进程为进程组长.
pause();
signal(SIGINT,handler2);
setsid();
pause();