改变信号的响应动作与发送信号的应用实例[signal()/kill()]

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

要求:
售票员司机(可以持续报站)
用信号模拟司机售票员:创建子进程代表售票员,父进程代表司机。
1:售票员捕捉SIGINT(代表开车),发SIGUSR1 给司机,司机捕捉到SIGUSR1 信号后打印“move to next station”。
2:售票员捕捉SIGQUIT(代表靠站),发SIGUSR2 给司机,司机捕捉到SIGUSR2 信号后打印“stop the bus”。
3:司机捕获到SIGTSTP(车到总站),发SIGUSR1给售票员,售票员捕捉到SIGUSR1信号后打印“all get off the bus”,全部进程结束 。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <signal.h>

char buf[20];

void drive()					//售票员捕捉SIGINT,开车
{
	printf("drive!\n");
	kill(getppid(),10);
}

void stand()					//售票员捕捉SIGQUIT,靠站
{
	printf("stand!\n");
	kill(getppid(),12);
}

void get_off()					//售票员收到SIGUSR1,到达总站
{
	printf("all get off the bus!\n");
	exit(0);
}

void move()						//司机捕捉到SIGUSR1,开车
{
	printf("move to next station\n");
}

void stop()						//司机捕捉到SIGUSR2,靠站
{
	printf("stop the bus\n");
}

void arrive()					//司机捕捉到SIGTSTP,到达总站
{
	printf("arrive!\n");
	kill(atoi(buf),10);
}

int main()
{		
	pid_t id = fork();
	if(id == 0)					//售票员
	{
		signal(SIGUSR1,get_off);
		signal(SIGINT,drive);
		signal(SIGQUIT,stand);
		
		pid_t ID = getpid();
		sprintf(buf,"%d",ID);
		
		while(1)
		{
			printf("\n输入信号!\n");
			int n;
			scanf("%d",&n);
			
			if(n == 20)
			{
				kill(getppid(),n);
			}
			
			kill(getpid(),n);
			sleep(1);
		}
	}
	
	if(id > 0)					//司机
	{
		signal(SIGUSR1,move);
		signal(SIGUSR2,stop);
		signal(SIGTSTP,arrive);
	}
	wait(NULL);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳佳鸽

若文章帮到你,能不能请我喝杯茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值