#include<stdio.h> #include<signal.h> #include<unistd.h> int pid1,pid2; int endflag=0,pf1=0,pf2=0; void intdelete() { kill(pid1,16); kill(pid2,17); endflag=1; } void int1() { printf("child process 1 is killed by parent!\n"); exit(0); } void int3() { printf("child process 2 is killed by parent!\n"); exit(0); } main() { int exitpid; signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())==-1); if(pid1==0) { printf("p1\n"); signal(SI_USER,int1); signal(16,SIG_IGN); pause(); exit(0); } else { while((pid2=fork())==-1); if(pid2==0) { printf("p2\n"); signal(SIGUSR2,int3); signal(17,SIG_IGN); pause(); exit(0); } else { printf("parent\n"); signal(SIGINT,intdelete); waitpid(-1,&exitpid,0); printf("parent process is killed!\n"); exit(0); } } }解释每一行代码,并分析实现功能,作用,预判输出结果并对输出结果进行分析
时间: 2024-03-08 22:46:34 浏览: 86
1. `#include<stdio.h>`:头文件,包含标准输入输出函数。
2. `#include<signal.h>`:头文件,包含信号处理函数。
3. `#include<unistd.h>`:头文件,包含系统调用函数。
4. `int pid1,pid2;`:定义两个进程的 ID。
5. `int endflag=0,pf1=0,pf2=0;`:定义结束标志和两个进程的进程状态。
6. `void intdelete()`:定义信号处理函数。
7. `kill(pid1,16);`:向进程 pid1 发送信号 16。
8. `kill(pid2,17);`:向进程 pid2 发送信号 17。
9. `endflag=1;`:将结束标志设置为 1。
10. `void int1()`:定义信号处理函数。
11. `printf("child process 1 is killed by parent!\n");`:输出提示信息。
12. `exit(0);`:进程退出。
13. `void int3()`:定义信号处理函数。
14. `printf("child process 2 is killed by parent!\n");`:输出提示信息。
15. `exit(0);`:进程退出。
16. `signal(SIGINT,SIG_IGN);`:忽略信号 SIGINT。
17. `signal(SIGQUIT,SIG_IGN);`:忽略信号 SIGQUIT。
18. `while((pid1=fork())==-1);`:创建子进程 pid1,如果创建失败则一直循环。
19. `if(pid1==0)`:判断是否为子进程 pid1。
20. `printf("p1\n");`:输出提示信息。
21. `signal(SI_USER,int1);`:注册信号 SI_USER 的信号处理函数为 int1。
22. `signal(16,SIG_IGN);`:忽略信号 16。
23. `pause();`:挂起进程,等待信号。
24. `exit(0);`:进程退出。
25. `else`:如果不是子进程 pid1。
26. `while((pid2=fork())==-1);`:创建子进程 pid2,如果创建失败则一直循环。
27. `if(pid2==0)`:判断是否为子进程 pid2。
28. `printf("p2\n");`:输出提示信息。
29. `signal(SIGUSR2,int3);`:注册信号 SIGUSR2 的信号处理函数为 int3。
30. `signal(17,SIG_IGN);`:忽略信号 17。
31. `pause();`:挂起进程,等待信号。
32. `exit(0);`:进程退出。
33. `else`:如果不是子进程 pid2。
34. `printf("parent\n");`:输出提示信息。
35. `signal(SIGINT,intdelete);`:注册信号 SIGINT 的信号处理函数为 intdelete。
36. `waitpid(-1,&exitpid,0);`:等待任意子进程退出。
37. `printf("parent process is killed!\n");`:输出提示信息。
38. `exit(0);`:进程退出。
该程序创建了三个进程:一个父进程和两个子进程,父进程会向两个子进程分别发送信号 16 和 17,子进程收到信号后会输出提示信息并退出,父进程会等待任意子进程退出后输出提示信息并退出。预判输出结果为:
```
p1
p2
parent
child process 1 is killed by parent!
parent process is killed!
```
分析:首先创建了子进程 pid1,输出了 "p1",然后创建了子进程 pid2,输出了 "p2",然后输出了 "parent"。父进程向子进程 pid1 发送信号 16,子进程 pid1 收到信号后输出了 "child process 1 is killed by parent!" 并退出。父进程等待子进程退出后输出了 "parent process is killed!" 并退出。
阅读全文