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