linux进程间通信之信号

本文通过使用信号机制来模拟公交车的运行状态,包括开车、停车及到站等场景。司机和售票员通过发送不同的信号相互通知操作,如SIGINT表示开车,SIGQUIT表示停车,而SIGTSTP则表示到站。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


微笑用信号的知识实现司机售票员问题:
1、售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印("let's gogogog")
2、售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印("stop the bus")
3、司机捕捉SIGTSTP(代表车到终点站)信号,向售票员发送SIGUSR1信号,售票员打印("please get off the bus"),
   然后售票员下车。
4、司机等待售票员下车,之后司机再下车

/*************************************************************************
	> File Name: example.c
	> Author: XXDK
	> Email: v.manstein@qq.com 
	> Created Time: Fri 17 Mar 2017 12:20:50 AM PDT
 ************************************************************************/

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>

static pid_t slr_pid;

void drv_handler(int signo)
{
	if(signo == SIGUSR1) 
		printf("driver: let's gogogo\n");
	else if(signo == SIGUSR2)
		printf("driver: stop the bus\n");		
	else if(signo == SIGTSTP) 
		kill(slr_pid, SIGUSR1);
	else if(signo == SIGCHLD){
		wait(NULL);
		printf("main exit\n");
		exit(0);
	}

}

void slr_handler(int signo)
{ 
	if(signo == SIGINT) 
		kill(getppid(), SIGUSR1);
	else if(signo == SIGQUIT)
		kill(getppid(), SIGUSR2);
	else if(signo == SIGUSR1) {
		printf("seller: please get off the car\n");
		printf("child process exit\n");
		exit(0);
	}
}

int main()
{

	slr_pid = fork();

	if(slr_pid < 0) {
		perror("fork error:");
	}
	else if(slr_pid == 0) {
		signal(SIGINT,  slr_handler);
		signal(SIGQUIT, slr_handler);
		signal(SIGUSR1, slr_handler);
		signal(SIGUSR2, SIG_IGN);
		signal(SIGTSTP, SIG_IGN);
			
	 }else {
		signal(SIGINT,  SIG_IGN);
		signal(SIGQUIT, SIG_IGN);
		signal(SIGUSR1, drv_handler);
		signal(SIGUSR2, drv_handler);
		signal(SIGTSTP, drv_handler);
		signal(SIGCHLD, drv_handler);
	}
	while(1)
		pause();

	exit(0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值