linux进程间通信之信号

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011583798/article/details/62895423


微笑用信号的知识实现司机售票员问题:
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);
}


展开阅读全文

没有更多推荐了,返回首页