- 论坛徽章:
- 0
|
/*****************************************************
用fork( )创建两个子进程,再用系统调用signal( )让父进程
捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,
父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉
到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!
**********************************************************/
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
int wait_mark;
void waiting( );
void stop( );
void tt()
{
printf("2222");
}
void main( )
{
int p1,p2;
while((p1=fork())==-1);
signal(SIGINT,stop);
if(p1>0) /*主进程的处理*/
{
while((p2=fork())==-1);
if(p2>0) /*主进程的处理*/
{
wait_mark=1;
waiting( ); /*等待接收ctrl+c信号*/
kill(p1,16); /*向p1发出信号16*/
kill(p2,17); /*向p2发出信号17*/
/*同步*/
wait(0);
wait(0);
printf("parents is killed \n");
exit(0);
}
else /*p2进程的处理*/
{
wait_mark=1;
signal(17,stop);
signal(SIGINT,tt);
waiting();
sleep(10); /*等待信号17*/
lockf(stdout,1,0); /*用上锁的方法实现互斥*/
printf("P2 is killed by parent \n");
lockf(stdout,0,0);
exit(0);/*模拟P2被kill时进程的工作*/
}
}
else /*p1进程的处理*/
{
wait_mark=1;
signal(16,stop);
waiting( ); /*等待信号16*/
lockf(stdout,1,0); /*用上锁的方法实现互斥*/
printf("P1 is killed by parent \n");
lockf(stdout,0,0);
/*模拟P1被kill时进程的工作*/
exit(0);
}
}
void waiting( )
{
while(wait_mark!=0);
}
void stop( )
{
wait_mark=0;
}
我在P2进程中加了一个signal(SIGINT,tt),我按俩次CTRL+C,会输出8个2,就是说第一次按CTRL+C时父进程收到CTRL+C信号,P2也收到CTRL+C信号,不是说信号是只能消费一次吗? |
|