代码之家  ›  专栏  ›  技术社区  ›  Hazem Alabiad

通过处理程序获取僵尸进程

  •  1
  • Hazem Alabiad  · 技术社区  · 7 年前

    下面编写的代码是处理接收到的信号,并通过父进程“从CMU的系统编程过程”获取僵尸。

    第一季度 . 什么是规则 -1 “waitpid函数的第一个参数”?难道我们不应该通过我们正在收获的僵尸的pid来代替吗?

    第2季度 . 对于这里的循环,它是否会在任何前一个僵尸接收到信号时检查所有僵尸?

    int ccount = 0;
    void child_handler2(int sig)
    {
    int child_status;
    pid_t pid;
    while ((pid = waitpid(-1, &child_status, WNOHANG)) > 0) {
       ccount--;
       safe_printf("Received signal %d from process %d\n",sig, pid);
     }
    }
    
    void fork14()
    have sent this signal
    {
    pid_t pid[N];
    int i, child_status;
    linux> ./forks 14
    ccount = N;
    signal(SIGCHLD, child_handler);
    for (i = 0; i < N; i++)
       if ((pid[i] = fork()) == 0) {
          sleep(1); /* deschedule child */
          exit(0); /* Child: Exit */
       }
    
    while (ccount > 0)
    pause(); /* Suspend until signal occurs */
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Hazem Alabiad    7 年前

    第一季度。 “-1”表示检查所有子进程。

    第2季度 . 当子进程死亡时,内核向其父进程发送一条消息以获取它。而且由于接收到的信号不能排队,“一次最多只能接收一个”的性质,如果在处理程序处理完前一个信号之前接收到,可能会导致丢弃一些后一个信号,也可能不会。因此,我们无法确保届时会有N个僵尸,因为其中一些僵尸可能已经由处理程序自动处理。这就是为什么每次我们收获僵尸时都要检查 如果有 另一个僵尸来收割它或(他们)。所以,这里的检查是为了防止等待一个已经收获的孩子,以避免父母冻结“如果我们让它等待收获的僵尸”。