
编程用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 }
转载于:.html
本文发布于:2024-02-03 04:18:21,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170690509948600.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |