#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> void waiting(), stop(); int wait_mark; int main() { int p1, p2; signal(SIGINT, stop); while ((p1 = fork()) == -1); if (p1 > 0) { ① while ((p2 = fork()) == -1); if (p2 > 0) { ② wait_mark = 1; waiting(0); kill(p1, 10); kill(p2, 12); wait(); wait(); printf("Parent process is killed!\n"); exit(0); } else { wait_mark = 1; signal(12, stop); waiting(); lockf(1, 1, 0); printf("Child process 2 is killed by parent!\n"); lockf(1, 0, 0); exit(0); } } else { wait_mark = 1; signal(10, stop); waiting(); lockf(1, 1, 0); printf("Child process 1 is killed by parent!\n"); lockf(1, 0, 0); exit(0); } } void waiting() { while (wait_mark != 0); } void stop() { wait_mark = 0; }如果把signal(SIGINT, stop)放在程序中的①号和②号位置(见实验指导书中参考程序),结果会怎样?并分析原因。
时间: 2024-02-14 20:33:44 浏览: 135
#include <stdio.h>
如果将 `signal(SIGINT, stop)` 放在程序中的 `①` 号和 `②` 号位置,那么程序的输出结果会发生变化。
具体而言,在 `①` 号位置放置 `signal(SIGINT, stop)`,在 `②` 号位置不放置。这意味着父进程在创建子进程 `p1` 之后就会安装信号处理函数,而在创建子进程 `p2` 之前不会安装信号处理函数。因此,子进程 `p1` 在接收到信号后可以正确地停止等待,但子进程 `p2` 将不会响应相应的信号。
在 `②` 号位置放置 `signal(SIGINT, stop)`,在 `①` 号位置不放置。这意味着父进程在创建子进程 `p1` 之后不会安装信号处理函数,而在创建子进程 `p2` 之前会安装信号处理函数。因此,子进程 `p2` 在接收到信号后可以正确地停止等待,但子进程 `p1` 将不会响应相应的信号。
综上所述,为了保证程序的正确性,应该在子进程创建之前就安装信号处理函数,即在 `while` 循环之前安装。
阅读全文