本关任务:编写一个程序,父进程创建一个子进程,并发送一个软中断信号给子进程。子进程接收到信号后,执行指定的函数,然后自我终止并唤醒父进程,父进程在子进程终止后输出信息并结束。测试输入:无; 预期输出: Parent: Sending signal 17 to child process. Child: Signal received, executing handler function. Parent: Child process finished, exiting. #include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/wait.h> void signal_handler() { printf("Child: Signal received, executing handler function.\n"); } int main() { int pid; // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End *********/ if ((pid = fork()) > 0) { printf("Parent: Sending signal 17 to child process.\n"); kill(pid, 17); wait(NULL); printf("Parent: Child process finished, exiting.\n"); } else if (pid == 0) { printf("Child: Waiting for signal...\n"); pause(); // Wait for signal _exit(0); } else { perror("Fork failed"); } return 0; }
时间: 2025-06-27 14:07:19 浏览: 14
### 实现父子进程通信的示例代码
以下是通过 `kill()` 发送信号以及子进程捕获 `SIGUSR1` 并执行回调函数的一个完整示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
// 定义信号处理函数
void signal_handler(int signo) {
if (signo == SIGUSR1) {
printf("子进程接收到父进程发送的 SIGUSR1 信号\n");
}
}
int main() {
pid_t pid;
// 创建子进程
pid = fork();
if (pid > 0) { // 父进程逻辑
sleep(1); // 给子进程一些时间来初始化
printf("父进程正在向子进程发送 SIGUSR1 信号...\n");
// 向子进程发送 SIGUSR1 信号
if (kill(pid, SIGUSR1) != 0) {
perror("kill error");
exit(EXIT_FAILURE);
}
sleep(2); // 等待一段时间观察效果
printf("父进程完成操作。\n");
} else if (pid == 0) { // 子进程逻辑
// 设置信号处理函数
if (signal(SIGUSR1, signal_handler) == SIG_ERR) {
perror("signal error");
exit(EXIT_FAILURE);
}
printf("子进程准备接收信号...\n");
// 阻塞等待信号到来
while (1) {
pause();
}
} else { // 错误处理
perror("fork error");
exit(EXIT_FAILURE);
}
return 0;
}
```
#### 说明
上述代码实现了以下功能:
- **父进程**使用 `fork()` 创建了一个子进程。
- 在子进程中,设置了针对 `SIGUSR1` 的信号处理函数[^1]。
- 当父进程调用 `kill(pid, SIGUSR1)` 后,子进程会捕捉到该信号,并触发其对应的信号处理函数[^4]。
---
### 关键知识点解析
1. **`fork()` 和信号的关系**
- 调用 `fork()` 创建的新子进程会继承父进程在 `fork()` 前设置的所有信号属性,包括信号掩码和信号处理方式[^3]。
2. **`pause()` 函数的作用**
- `pause()` 是一种阻塞函数,它会让当前进程挂起直到接收到任何未屏蔽的信号为止。这使得子进程可以一直保持等待状态,直到父进程发出信号。
3. **`kill()` 函数的功能**
- `kill()` 不仅能用于终止进程,还可以用来向其他进程发送自定义信号(如 `SIGUSR1`, `SIGUSR2`),从而实现跨进程间的同步或通知机制。
4. **信号处理函数的设计**
- 用户可以通过 `signal()` 或更高级别的 `sigaction()` 来绑定特定信号与其对应的动作。一旦目标信号到达,则自动跳转至预设好的回调函数中运行相应指令序列。
---
###
阅读全文
相关推荐

















