使用signal进行进程通信例子
时间: 2024-09-13 09:03:21 浏览: 17
在Linux中,`signal()`函数通常用于处理进程间的异常情况而非常规的消息传递,因为它是设计来中断当前活动的任务的。然而,有一种叫做"自定义信号"(User-Defined Signal)的概念,可以让进程之间通过一种间接的方式来交换信息。下面是一个使用自定义信号的例子:
**parent_process.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
// 定义一个全局变量作为数据载体
volatile sig_atomic_t data = 0;
void custom_signal_handler(int signum) {
switch (signum) {
case YOUR_SPECIAL_SIGNAL: // 替换为你想要的自定义信号
printf("Received custom signal, updating data to %d\n", ++data);
break;
default:
printf("Unknown signal received!\n");
}
}
int main() {
// 注册自定义信号处理器
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = custom_signal_handler;
act.sa_flags = SA_NODEFER; // 防止信号被捕获后被重置
sigaction(YOUR_SPECIAL_SIGNAL, &act, NULL);
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程
close(STDIN_FILENO); // 关闭标准输入,防止意外读取
pause(); // 挂起进程,等待信号
exit(0); // 子进程结束
} else { // 父进程
// 向子进程发送自定义信号
kill(child_pid, YOUR_SPECIAL_SIGNAL);
printf("Sent custom signal to child process.\n");
while (waitpid(child_pid, NULL, 0) != child_pid); // 等待子进程退出
}
return 0;
}
```
**child_process.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void custom_signal_handler(int signum) {
// 在这里你可以处理接收到的信号,例如获取data变量值
printf("Child process received signal, current data is %d\n", data);
// 接收完信号后,自行做后续任务,然后结束
exit(0);
}
int main() {
signal(YOUR_SPECIAL_SIGNAL, custom_signal_handler); // 注册信号处理器
close(STDOUT_FILENO); // 关闭标准输出
// 子进程可以执行其他任务,这里仅简单地等待信号
while (true);
return 0;
}
```
在这个例子中,父进程创建子进程,并向子进程发送自定义信号。子进程捕获到信号后,更新数据并与父进程同步。这并不是标准的消息传递,但展示了信号在特殊场景下的间接通信机制。
**相关问题--:**
1. 自定义信号与系统信号有何不同?
2. 如何避免自定义信号导致的竞态条件?
3. 如果需要双向通信,有没有更好的选择?