c - 从孩子到父母的丢失信号
问题描述
我正在创建几个子进程,它们向它们的父进程发送信号并死掉。我只是数了数。但我从来没有得到正确的计数。有些信号永远不会被处理程序捕获。
我应该如何编码?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int ended = 0;
void handler(int sig){
ended++;
}
int main(int argc, char **argv){
int i;
pid_t pid, ppid;
if (signal(SIGUSR1, handler) < 0) {
fprintf(stderr, "signal failed.\n");
exit (-1);
}
ppid = getpid();
for (i = 0; i < 50; i++){
if ((pid = fork()) < 0){
fprintf(stderr, "fork failed.\n");
exit(-1);
}
if (pid == 0){
kill(ppid, SIGUSR1);
exit(0);
}
}
while (wait(NULL) > 0);
printf("ended = %d\n", ended);
return 0;
}
这个程序的输出有时是 47,有时是 39……但从来不是 50
解决方案
这里的问题是信号充当硬件中断,您的处理程序函数将是 ISR(中断服务程序)。然后,如果多个相同值的信号“同时”发生,linux内核将它们视为一个信号。信号并非设计为以这种方式使用。一个信号应该用于将一个进程的状态通知给另一个进程。要实现进程之间的通信,您应该使用 IPC(进程间通信)机制,例如队列、套接字或管道。
推荐阅读
- ajax - 实现了子文件夹的 Ajax URL 不正确
- javascript - 语义下拉多选的限制
- react-native - 未定义 - 从初始屏幕传递给“App.js”的参数
- arrays - 如何阻止数组生成太多对象?
- jenkins - Groovy 中使用 grep 的高级 if else 语句
- spring-data-jpa - org.hibernate.MappingException 无法确定表的类型
- javascript - 如何从 React 组件内的映射项中设置状态
- list - 确定 Haskell 列表中是否存在重复元素
- angular - 将我的项目从 Angular 7.2 升级到 Angular 8 后,编译时间增加了 3 倍。我该如何解决
- api - Using a generic OpenID Connect Resource Provider (RP) library