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