用系统调用列出所有的信号;(kill –l) 用系统调用signal()让父进程捕捉键盘上来的中断信号(Ctrl-C); 当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止 Child Process 1 is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent Process is Killed!
时间: 2024-02-12 19:07:50 浏览: 52
以下是一个简单的示例程序,实现了上述要求的功能。程序创建了两个子进程,当捕获到中断信号时,父进程会向两个子进程发送 `SIGTERM` 信号,子进程收到信号后会输出一条消息并终止运行。当两个子进程均终止运行后,父进程输出一条消息并终止运行。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void child_func(int num) {
printf("Child Process %d is Killed by Parent!\n", num);
exit(0);
}
int main() {
pid_t pid1, pid2;
// 创建子进程1
pid1 = fork();
if (pid1 == 0) {
// 子进程1
signal(SIGTERM, SIG_DFL); // 子进程1不捕获信号
while(1) ; // 子进程1一直运行
}
// 创建子进程2
pid2 = fork();
if (pid2 == 0) {
// 子进程2
signal(SIGTERM, SIG_DFL); // 子进程2不捕获信号
while(1) ; // 子进程2一直运行
}
// 父进程
printf("Parent Process is Running!\n");
// 捕获中断信号
signal(SIGINT, SIG_IGN); // 忽略中断信号
signal(SIGINT, killchild); // 捕获中断信号
// 等待子进程终止
int status;
waitpid(pid1, &status, 0);
waitpid(pid2, &status, 0);
// 输出消息并终止
printf("Parent Process is Killed!\n");
exit(0);
}
void killchild(int sig) {
// 向子进程发送 SIGTERM 信号
kill(pid1, SIGTERM);
kill(pid2, SIGTERM);
}
```
需要注意的是,在 `killchild` 函数中需要使用 `kill` 函数向子进程发送信号,但是 `pid1` 和 `pid2` 变量是在 `main` 函数中定义的,无法直接在 `killchild` 函数中使用。为了解决这个问题,我们可以将 `pid1` 和 `pid2` 定义为全局变量,这样就可以在 `killchild` 函数中使用了。
阅读全文