【发布时间】:2018-05-11 14:03:31
【问题描述】:
我有一个父进程,它产生十个子进程并使用 SIGCHILD 处理程序来通知子进程何时死亡。子进程将在启动时发出通知,然后立即退出。
我使用 SA_NODEFER 标志来防止 SIGCHLD 信号在太多进来时被丢弃。孩子们都被正确终止和收割,但在这个脚本中,当通过控制台同时终止两个信号时,信号同时发送时间总是呈现为一。
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
void CHLDHandler(int sig)
{
char child[] = "Child finished!\n";
write(1, &child, sizeof(child));
}
int main(int argc, char const *argv[]) {
struct sigaction sa;
sa.sa_handler = CHLDHandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NODEFER;
sigaction(SIGCHLD,&sa,NULL);
for (size_t i = 0; i < 10; i++) {
int pid = fork();
if (pid == 0)
{
int pid = getpid();
printf("I'm a child with pid %d!\n", pid);
return 0;
}
}
while(1)
{
wait(NULL);
}
return 0;
}
【问题讨论】:
-
这是适当的,如果不是完全重复的话:stackoverflow.com/questions/8398298/handling-multiple-sigchld
-
我明白了。我的任务表明它应该是一个信号处理程序,显然 signalfd 的手册页说它是信号处理程序的替代品。因此,虽然另一种方式可行,但它似乎也可以使用信号处理程序。