# include<stdio.h> # include<signal.h> # include<unistd.h> void waiting(); void stop(); int main(void) { int p1, p2; signal(SIGINT,stop); while((p1=fork())= =-1); if(p1>0) /* In Parent Process*/ { /*(1) */ while((p2=fork())= =-1); if(p2>0) /*in parent process*/ { /* (2) */ wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait( ); wait( ); printf(“parent process is killed!\n”); exit(0); } else{ /*In Child Process 2*/ 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{ /*In Child Process 1*/ 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); } return 0; }你可以分析一下这段代码吗
时间: 2024-01-17 20:05:24 浏览: 79
这段代码是一个进程间通信的例子,可以通过信号来实现。代码中创建了两个子进程p1和p2,然后父进程向p1发送信号SIGUSR1(信号编号为10),向p2发送信号SIGUSR2(信号编号为12)。子进程在收到对应的信号后打印相应的信息,并使用lockf函数进行输出的同步。
具体分析如下:
1. 头文件
```c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
```
这里包含了所需要的头文件。
2. 函数声明
```c
void waiting();
void stop();
```
函数waiting和stop的声明。
3. 主函数
```c
int main(void) {
int p1, p2;
signal(SIGINT,stop);
```
首先定义了两个进程p1和p2,然后使用signal函数注册了信号SIGINT(信号编号为2),并且将其处理函数设置为stop。
```c
while((p1=fork()) == -1);
if(p1>0) { /* In Parent Process*/
while((p2=fork()) == -1);
if(p2>0) { /*in parent process*/
wait_mark=1;
waiting(0);
kill(p1,10);
kill(p2,12);
wait( );
wait( );
printf("parent process is killed!\n");
exit(0);
} else { /*In Child Process 2*/
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 { /*In Child Process 1*/
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);
}
return 0;
}
```
在主函数中,使用while循环创建两个子进程p1和p2,并且根据fork的返回值进行判断,如果返回值是-1,则表示创建子进程失败,需要继续循环尝试。如果返回值大于0,则表示当前进程是父进程,需要进一步创建子进程p2。如果返回值是0,则表示当前进程是子进程p1或p2。
如果当前进程是父进程,则使用kill函数向p1和p2发送信号SIGUSR1和SIGUSR2,然后使用wait函数等待两个子进程的结束,并打印相应的信息。
如果当前进程是子进程p1或p2,则使用signal函数注册对应的信号处理函数stop,然后使用waiting函数进行等待。等待结束后,使用lockf函数进行输出的同步,并打印相应的信息,最后使用exit函数退出当前进程。
4. 函数waiting和stop
```c
void waiting() {
while(wait_mark!=0);
}
void stop() {
wait_mark=0;
}
```
waiting函数是一个简单的循环,只要wait_mark不等于0,则一直循环等待。stop函数将wait_mark设置为0,用于退出等待循环。
总体来说,这段代码使用了进程间通信和信号处理技术,实现了父进程向两个子进程发送信号,然后子进程根据接收到的信号打印相应的信息。同时,使用lockf函数进行输出的同步,避免了输出混乱。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)