编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止
时间: 2024-02-05 20:12:16 浏览: 119
下面是使用C语言编写的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void child_handler(int sig) {
printf("Child %d received signal %d and terminated\n", getpid(), sig);
exit(0);
}
int main() {
pid_t pid1, pid2;
// create first child process
pid1 = fork();
if (pid1 < 0) {
perror("fork failed");
exit(1);
} else if (pid1 == 0) {
// child process 1
printf("Child 1 (PID=%d) is running\n", getpid());
signal(SIGTERM, child_handler);
while(1) {
printf("Child 1 is waiting...\n");
sleep(1);
}
} else {
// parent process
// create second child process
pid2 = fork();
if (pid2 < 0) {
perror("fork failed");
exit(1);
} else if (pid2 == 0) {
// child process 2
printf("Child 2 (PID=%d) is running\n", getpid());
signal(SIGTERM, child_handler);
while(1) {
printf("Child 2 is waiting...\n");
sleep(1);
}
} else {
// parent process
printf("Parent (PID=%d) is running\n", getpid());
signal(SIGINT, interrupt_handler);
while(1) {
printf("Parent is waiting...\n");
sleep(1);
}
}
}
return 0;
}
void interrupt_handler(int sig) {
printf("Parent received signal %d (CTRL+C)\n", sig);
kill(pid1, SIGTERM);
kill(pid2, SIGTERM);
}
```
在程序中,首先使用`fork()`函数创建了两个子进程,并在每个子进程中设置了`SIGTERM`信号的处理函数`child_handler()`。这个函数会在子进程接收到`SIGTERM`信号时被调用,输出进程ID和信号值,并调用`exit()`函数终止进程。
在主进程中,调用`signal()`函数设置了`SIGINT`信号的处理函数`interrupt_handler()`。这个函数会在主进程接收到`SIGINT`信号(即按下CTRL+C键)时被调用,输出信号值,并使用`kill()`函数向两个子进程发送`SIGTERM`信号,让它们终止运行。
阅读全文