编写一段c语言程序,使用系统调用 fork( )创建两个子进程,再用系统 调用 signal( )让父进程捕捉组合键的中断信号(即按 ctrl+c 键),当 捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发出信号, 子进程捕捉到父进程发来的信号后,分别输出下列信息后终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父 进 程 等 待 两 个 子 进 程 终 止 后 , 输 出 以 下 信 息 后 终 止 : Parent process exit! 【实验流程】 1、程序框图 parent 安装SIGINT信号 创建子进程p1 创建子进程p2 安装信号10 安装信号12 等待makre变为0 (1) (2) (3) 调用kill向p1和p2发 送信号 捕捉信号并向父进 程发送消息 捕捉信号并向父进 程发送消息
时间: 2024-02-04 08:04:03 浏览: 66
以下是实现了上述流程的 C 语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void child_handler(int signum) {
if (signum == SIGUSR1) {
printf("Child process %d is killed by parent!\n", getpid());
exit(0);
}
}
void parent_handler(int signum) {
if (signum == SIGINT) {
printf("Parent process received SIGINT signal!\n");
printf("Parent process is killing child processes...\n");
kill(0, SIGUSR1);
kill(0, SIGUSR1);
} else if (signum == SIGUSR1) {
printf("Parent process received SIGUSR1 signal from child!\n");
}
}
int main() {
pid_t p1, p2;
int maker = 1;
p1 = fork();
if (p1 == -1) {
printf("Failed to create child process 1!\n");
return -1;
} else if (p1 == 0) {
// Child process 1
signal(SIGUSR1, child_handler);
while (maker) {
// Do something here
}
exit(0);
}
p2 = fork();
if (p2 == -1) {
printf("Failed to create child process 2!\n");
return -1;
} else if (p2 == 0) {
// Child process 2
signal(SIGUSR1, child_handler);
while (maker) {
// Do something here
}
exit(0);
}
// Parent process
signal(SIGINT, parent_handler);
signal(SIGUSR1, parent_handler);
while (maker) {
// Do something here
}
printf("Parent process exit!\n");
return 0;
}
```
该程序首先创建两个子进程 p1 和 p2,然后分别在子进程和父进程中安装信号处理函数。子进程安装的信号处理函数会在收到 SIGUSR1 信号时输出子进程终止信息并退出,而父进程安装的信号处理函数则会在收到 SIGINT 或 SIGUSR1 信号时分别向两个子进程发出 SIGUSR1 信号,然后在收到 SIGUSR1 信号时输出相应的信息。
注意,程序中的 maker 变量是用来阻塞进程的,因为进程如果没有阻塞,就会一直运行下去,而无法等待信号的到来。在实际应用中,可以使用 sleep() 等函数实现类似的效果。
阅读全文