父进程构建两个子进程,使用信号知识使得有一个子进程结束另一个也结束
时间: 2024-02-28 09:56:42 浏览: 118
父进程和子进程
可以使用信号来实现这个需求。首先,父进程创建两个子进程,然后分别给它们注册 SIGUSR1 信号处理函数。当一个子进程结束时,它会向另一个子进程发送 SIGUSR1 信号,从而结束它的运行。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
void sigusr1_handler(int sig) {
printf("子进程%d收到 SIGUSR1 信号,结束运行\n", getpid());
exit(EXIT_SUCCESS);
}
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid1 == 0) { // 子进程1
signal(SIGUSR1, sigusr1_handler); // 注册 SIGUSR1 信号处理函数
sleep(5); // 子进程1运行5秒钟后结束
kill(getppid(), SIGUSR1); // 向父进程发送 SIGUSR1 信号
pause(); // 等待被 SIGUSR1 信号终止
exit(EXIT_SUCCESS);
} else { // 父进程
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) { // 子进程2
signal(SIGUSR1, sigusr1_handler); // 注册 SIGUSR1 信号处理函数
sleep(10); // 子进程2运行10秒钟后结束
kill(getppid(), SIGUSR1); // 向父进程发送 SIGUSR1 信号
pause(); // 等待被 SIGUSR1 信号终止
exit(EXIT_SUCCESS);
} else { // 父进程
signal(SIGUSR1, sigusr1_handler); // 注册 SIGUSR1 信号处理函数
pause(); // 等待被 SIGUSR1 信号终止
kill(pid1 == getpid() ? pid2 : pid1, SIGUSR1); // 向另一个子进程发送 SIGUSR1 信号
pause(); // 等待被 SIGUSR1 信号终止
printf("父进程结束\n");
exit(EXIT_SUCCESS);
}
}
}
```
在这个示例中,父进程创建了两个子进程,每个子进程都会在运行一段时间后向父进程发送 SIGUSR1 信号。当父进程接收到 SIGUSR1 信号时,它会向另一个子进程发送 SIGUSR1 信号,从而结束它的运行。注意,每个子进程也需要注册 SIGUSR1 信号处理函数,否则父进程无法向它们发送信号。
阅读全文