如果父母去世,孩子的过程不会自杀

时间:2013-02-26 20:50:29

标签: macos kqueue

我有一个子进程(在MacOS上运行),如果父进程退出,退出,终止,被杀或崩溃,我想自杀。遵循How to make child process die after parent exits?的建议,如果父程序崩溃,我无法安静地自杀。它将进入100%CPU,直到我手动杀死它。

以下是代码的要点:

int main(int argc, char *argv[])
{
  // Catch signals
  signal(SIGINT,  interruptHandler);
  signal(SIGABRT, interruptHandler);
  signal(SIGTERM, interruptHandler);
  signal(SIGPIPE, interruptHandler);

  // Create kqueue event filter
  int kqueue_fd = kqueue();
  struct kevent kev, recv_kev;
  EV_SET(&kev, parent_pid, EVFILT_PROC, EV_ADD|EV_ENABLE, NOTE_EXIT, 0, NULL);
  kevent(kqueue_fd, &kev, 1, NULL, 0, NULL);

  struct pollfd kqpoll;
  kqpoll.fd = kqueue_fd;
  kqpoll.events = POLLIN;

  // Start a run loop
  while(processEvents())
  {
    if(kill(parent_pid, 0) == -1)
      if(errno == ESRCH)
        break;

    if(poll(&kqpoll, 1, 0) == 1)
      if(kevent(kqueue_fd, NULL, 0, &recv_kev, 1, NULL))
        break;

    parent_pid = getppid();
    if(parent_pid == 1)
      break;

    sleep(a_short_time);

    // (simple code here causes subprocess to sleep longer if it hasn't
    // received any events recently)
  }
}

1 个答案:

答案 0 :(得分:0)

在这里回答我自己的问题:

出现此问题的原因并不在于检测父进程是否已经死亡。在processEvents()中,我正在从父进程轮询管道以查看是否存在任何通信。父母死后,poll()返回值1,读循环认为有无限数据等待读取。

解决方案是检测管道是否已断开。