父子进程互发信号

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值