编写一个c程序,满足以下要求: 用系统调用列出所有的信号;(kill –l) 用系统调用signal()让父进程捕捉键盘上来的中断信号(Ctrl-C); 当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止 Child Process 1 is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent Process is Killed! 主要的常量变量(实验2) int pid0,pid1,pid2;
时间: 2023-12-10 08:37:00 浏览: 69
计算机科学与技术课程操作系统接口.pptx
下面是满足要求的C程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void childHandler(int signo) {
if (signo == SIGINT) {
printf("Child Process %d is Killed by Parent!\n", getpid());
exit(0);
}
}
int main() {
int pid0, pid1, pid2;
int i;
// 列出所有信号
printf("All signals:\n");
system("kill -l");
// 创建两个子进程
pid1 = fork();
if (pid1 == 0) {
// 子进程1
signal(SIGINT, childHandler);
while (1) {
printf("Child Process 1 is Running\n");
sleep(1);
}
} else {
pid2 = fork();
if (pid2 == 0) {
// 子进程2
signal(SIGINT, childHandler);
while (1) {
printf("Child Process 2 is Running\n");
sleep(1);
}
} else {
// 父进程
signal(SIGINT, SIG_DFL);
printf("Parent Process is Running\n");
// 等待两个子进程结束
for (i = 0; i < 2; i++) {
wait(NULL);
}
printf("Parent Process is Killed!\n");
}
}
return 0;
}
```
程序首先使用 `system()` 函数调用 `kill -l` 命令列出所有信号。然后创建两个子进程,在子进程中使用 `signal()` 函数捕捉中断信号 `SIGINT`,并在捕捉到信号后输出信息并结束进程。父进程中忽略中断信号,并等待两个子进程结束后输出信息并结束进程。
注意,为了避免子进程也捕捉到父进程向自己发送的信号,父进程需要在创建子进程之前忽略中断信号,子进程需要使用 `signal()` 函数重新设置捕捉中断信号的处理函数。
阅读全文