#include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h> void waiting(),stop(); int wait_mark; 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 proces 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; }。什么意思
时间: 2024-04-06 18:30:05 浏览: 52
#include <stdio.h>
4星 · 用户满意度95%
这段代码是一个进程控制的示例程序,它创建了两个子进程,一个是 p1,另一个是 p2,然后在父进程中等待两个子进程结束后再退出。具体来说:
1. 在程序开始的时候,定义了两个函数 waiting() 和 stop(),waiting() 函数是一个无限循环,只有当 wait_mark 变量被设置为 0 时才会退出循环;stop() 函数是一个信号处理函数,当程序收到 SIGINT 信号时,会执行这个函数。
2. 在主函数中,先设置了程序收到 SIGINT 信号时执行 stop() 函数,然后使用 while 循环创建第一个子进程 p1,如果创建失败就一直循环等待,直到创建成功。如果当前进程是父进程,则再创建第二个子进程 p2,同样如果创建失败就一直循环等待,直到创建成功。
3. 在父进程中,设置了 wait_mark 变量为 1,然后等待两个子进程结束,等待的方式是调用 waiting() 函数。等待过程中,如果收到 SIGINT 信号,则执行 stop() 函数,将 wait_mark 变量设置为 0,退出等待循环。
4. 在子进程中,也设置了 wait_mark 变量为 1,然后等待父进程发送信号。如果收到的是 SIGINT 信号,则执行 stop() 函数,将 wait_mark 变量设置为 0,退出等待循环;如果收到的是 SIGUSR1 信号,则输出一个信息表示子进程被父进程杀死了。
5. 在等待结束后,父进程会向两个子进程发送信号,然后等待两个子进程结束,等待的方式是调用 wait() 函数。等待过程中,如果收到 SIGINT 信号,则执行 stop() 函数,将 wait_mark 变量设置为 0,退出等待循环。
6. 最后,父进程和两个子进程都会输出一个信息表示自己已经结束,并调用 exit() 函数退出。同时,使用 lockf() 函数保证输出信息的正确性,避免多个进程同时输出导致信息混乱。
阅读全文