linux进程间通信之信号

来源:互联网 发布:windows商店应用内购 编辑:程序博客网 时间:2024/05/21 17:05


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


0 0
原创粉丝点击