详细分析以下代码# include<stdlib.h> #include<sys/wait.h> #include <stdio.h> #include <signal.h> #include <unistd.h> void waiting(),stop(); int wait_mark; int main() { int p1,p2; while ((p1=fork())==-1); if (p1>0) { while ((p2=fork())==-1); if (p2>0) { printf("parent\n"); wait_mark=1; signal(SIGINT,stop); /接收DEL信号,并转stop()/ waiting(); kill(p1,16); /向P1发中断信号16/ kill(p2,17); /向P2发中断信号17/ wait(0); wait(0); printf("parent process is killed!\n"); exit(0); } else { printf("p2\n"); wait_mark=1; signal(17,stop); signal(SIGINT,SIG_IGN); waiting(); lockf(fileno(stdout),1,0); printf("child process 2 is killed by parent!\n"); lockf(fileno(stdout),0,0); exit(0); } } else { printf("p1\n"); wait_mark=1; signal(16,stop); signal(SIGINT,SIG_IGN); waiting(); lockf(fileno(stdout),1,0); printf("child process 1 is killed by parent!\n"); lockf(fileno(stdout),0,0); exit(0); } } void waiting() { while (wait_mark!=0); } void stop() { wait_mark=0; }
时间: 2024-03-25 19:39:54 浏览: 138
这段代码主要是演示了如何使用信号来控制进程的运行和停止。下面是代码的详细分析:
1. 引入头文件
```
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
```
这些头文件包含了进程控制和信号处理相关的函数。
2. 声明函数 waiting 和 stop
```
void waiting(), stop();
```
这里声明了两个函数 waiting 和 stop,分别用于等待和停止进程。
3. 定义变量 wait_mark
```
int wait_mark;
```
这个变量用于标记进程是否需要等待。
4. 主函数
```
int main() {
int p1, p2;
// 创建两个子进程
while ((p1 = fork()) == -1);
if (p1 > 0) {
while ((p2 = fork()) == -1);
if (p2 > 0) {
// 父进程
printf("parent\n");
wait_mark = 1;
// 注册信号处理函数
signal(SIGINT, stop);
// 等待子进程结束
waiting();
// 向子进程发送中断信号
kill(p1, 16);
kill(p2, 17);
wait(0);
wait(0);
printf("parent process is killed!\n");
exit(0);
} else {
// 子进程2
printf("p2\n");
wait_mark = 1;
signal(17, stop);
signal(SIGINT, SIG_IGN);
waiting();
lockf(fileno(stdout), 1, 0);
printf("child process 2 is killed by parent!\n");
lockf(fileno(stdout), 0, 0);
exit(0);
}
} else {
// 子进程1
printf("p1\n");
wait_mark = 1;
signal(16, stop);
signal(SIGINT, SIG_IGN);
waiting();
lockf(fileno(stdout), 1, 0);
printf("child process 1 is killed by parent!\n");
lockf(fileno(stdout), 0, 0);
exit(0);
}
}
```
这个主函数创建了两个子进程 p1 和 p2,然后进入了一个无限循环中。父进程在等待子进程结束时,注册了一个 SIGINT 信号的处理函数 stop,然后通过等待函数 waiting 等待子进程结束。一旦子进程结束,父进程向子进程发送中断信号,并等待子进程的结束。
子进程在启动后,先注册了一个 SIGINT 信号的处理函数 SIG_IGN,忽略了这个信号。然后通过等待函数 waiting 等待父进程发送信号。一旦收到信号,子进程输出一段信息,并结束运行。
5. 函数 waiting 和 stop
```
void waiting() {
while (wait_mark != 0);
}
void stop() {
wait_mark = 0;
}
```
这两个函数分别用于等待和停止进程。函数 waiting 通过检查 wait_mark 变量的值来判断是否需要等待。函数 stop 用于向等待函数发送信号,使得进程停止等待。
阅读全文