【发布时间】:2019-04-12 15:01:05
【问题描述】:
我正在创建几个子进程,它们向它们的父进程发送信号并死掉。我只是数了数。但我从来没有得到正确的计数。有些信号永远不会被处理程序捕获。
我应该如何编码?
#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
【问题讨论】:
-
如果多个信号同时出现(下一个在前一个处理之前),只会触发一个信号。未决信号是一种状态而不是计数。
-
除了 Zang 的注释之外,您不能在通过
kill调用的信号处理程序内写入静态int,这是未定义的行为。见en.cppreference.com/w/c/program/signal。