#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; }。该程序段前面部分使用了两个wait(),为什么?
时间: 2024-04-25 07:26:52 浏览: 46
该程序使用了两个wait()是为了等待子进程的结束。在程序中,父进程先fork()创建了两个子进程p1和p2,然后设置了wait_mark为1,调用了waiting(0)来等待子进程结束。当子进程结束时,会向父进程发送一个信号,父进程的信号处理函数stop()会将wait_mark设置为0,这样等待子进程的while循环就会结束,父进程继续执行下去。使用两个wait()是为了分别等待两个子进程结束。
相关问题
解释#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; }
这是一个使用信号处理和进程控制的简单的父子进程通信程序。程序中包含了四个头文件:stdio.h、signal.h、unistd.h和stdlib.h。
程序中定义了两个函数waiting()和stop(),分别用于进程等待和停止等待。同时定义了一个全局变量wait_mark,用于标记进程是否等待。
在主函数中,使用了fork()函数创建了两个子进程p1和p2。如果fork()返回值大于0,则说明当前进程为父进程,否则为子进程。父进程使用waiting()函数等待子进程完成,然后向子进程发送信号。子进程使用signal()函数注册信号处理函数,当接收到相应的信号时,执行stop()函数停止等待。
使用lockf()函数实现对输出的互斥,避免多个进程同时向标准输出输出。程序输出父进程和子进程被杀死的信息。最后使用exit()函数退出进程。
需要注意的是,这段代码可能存在一些问题,例如信号处理函数的稳定性和进程控制的正确性等。此外,程序的输出结果可能会因为进程调度顺序的不同而有所差异。
代码:#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; }。代码中waiting(0)和waiting有啥区别
代码中的 `waiting(0)` 和 `waiting()` 在语法上没有区别,两者都是调用 `waiting()` 函数。不过,在这个程序中,它们的作用是不同的。
`waiting(0)` 在父进程中被调用,它的作用是让父进程等待子进程终止。这是因为,在父进程中,我们希望等待两个子进程都终止之后再继续执行父进程的代码。
`waiting()` 在子进程中被调用,它的作用是让子进程等待接收到一个信号后再继续执行。这是因为,在子进程中,我们希望等待父进程发送一个信号,以便子进程可以终止。
阅读全文