#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/wait.h>
int handler(int signo)
{
switch(signo)
{
case SIGUSR1:
printf("parent : catch the signal from child\n");//处理信号SIGUSR1;
break;
case SIGUSR2:
printf("child : catch the signal from parent\n");//处理信号SIGUSR2;
break;
default:
printf("fail to send signal\n");//其实无法执行到这里
break;
}
return 0;
}
int main()
{
pid_t ppid,cpid;
//为两个信号设置信号处理程序
if(signal(SIGUSR1,handler) == SIG_ERR)//设置出错
{
perror("can not set handler for SIGUSR1\n");
exit(-1);
}
if(signal(SIGUSR2,handler) == SIG_ERR)
{
perror("can not set handler for SIGUSR2\n");//设置出错
exit(-1);
}
ppid = getpid();//得到父进程的进程ID
if((cpid = fork()) < 0)//创建子进程
{
perror("fail to fork child process\n");
exit(-1);
}
else if(cpid == 0)//子进程
{
if(kill(ppid,SIGUSR1) == -1)//向父进程发送SIGUSR1信号
{
perror("fail to send SIGUSR1\n");
exit(-1);
}
while(-1);//死循环,等待父进程的信号
}
else
{//父进程
sleep(1);//休眠1秒钟,保证子进程先运行
if(kill(cpid,SIGUSR2) == -1)//向子进程发送SIGUSR2信号
{
perror("fail to send SIGUSR2\n");
exit(-1);
}
sleep(1);//休眠,保证SIGKILL信号后于SIGUSR2发送
printf("now parent will kill child process\n");
if(kill(cpid,SIGKILL) == -1)//发送SIGKILL信号杀死子进程
{
perror("fail to kill child process\n");
exit(-1);
}
if(wait(NULL) == -1)//回收子进程状态,避免僵尸进程
{
perror("fail to wait\n");
exit(-1);
}
printf("child process was killed\n");
}
return 0;
}
父子进程互发信号
最新推荐文章于 2023-10-11 14:58:16 发布