进程通信——司机售票员问题

【进程通信——司机售票员问题】编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行 。
3、编制一段程序,实现进程的管道通信 。使用pipe()建立一条管道线 。两个子进程p1和p2分别向管道各写一句话:
Child 1 is!
Child 2 is!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上 。
1 #include2 #include3 #include4 #include 5 void saler(int);//售票员信号处理函数 6 void driver(int);//司机信号处理函数 7 pid_t pid;//保存子进程号 8 int main() 9 {10if ((pid = fork()) == -1)11{12perror("fork");13return -1;14}15if (pid == 0)//子进程(售票员)16{17signal(SIGINT, saler);//处理SIGINT信号,不退出进程(如果不注册该信号,则会本进程会退出) 。注:ctrl+c可向所有进程发送退出信号,默认退出所有进程18signal(SIGQUIT, saler);//处理SIGQUIT信号,不退出进程 。注:ctrl+\可向所有进程发送退出信号,默认退出所有进程19signal(SIGUSR1, saler); //处理用户自定义信号SIGUSR120signal(SIGTSTP, SIG_IGN);//忽略SIGTSTP信号 。注:ctrl+z可向所有进程发送该信号,暂停所有进程21while (1)22pause();23}24else//父进程(司机)25{26signal(SIGINT, SIG_IGN);27signal(SIGQUIT, SIG_IGN);28signal(SIGTSTP, driver);29signal(SIGUSR1, driver);30signal(SIGUSR2, driver);31while (1)32pause();33}34return 0;35 }36 37 void saler(int no)38 {39if (no == SIGINT)40kill(getppid(), SIGUSR1);//如果接收到SIGINT信号,则向父进程(司机)发送SIGUSR1信号41if (no == SIGQUIT)42kill(getppid(), SIGUSR2);43if (no == SIGUSR1)44{45printf("please get off the bus!\n");46kill(0, SIGKILL);//杀死该进程组的所有进程47}48 }49 50 void driver(int no)51 {52if (no == SIGUSR1)53printf("let's gogogo!\n");54if (no == SIGUSR2)55printf("stop the bus!\n");56if (no == SIGTSTP)57kill(pid, SIGUSR1);//如果接受到SIGTSTP信号,则向子进程(售票员)发送SIGUSR1信号58 }

进程通信——司机售票员问题

文章插图