为什么即使设置了SA_NODEFER标志,sigaction处理程序也不处理每个信号?

时间:2018-05-11 14:03:32

标签: c signals

我有一个父进程,它生成十个子进程,并使用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;
}

0 个答案:

没有答案