为什么线要打印两次?

aka*_*man 1 c unix fork zombie-process

我是UNIX编程的新手,我正在阅读僵尸进程以及如何使用fork()两次避免它们.我从一本书中读取代码并试图在我的系统上运行它..我正在使用ubuntu 12.04.我运行了以下代码:

#include<stdio.h>   
#include<sys/wait.h>
#include<stdlib.h>

int main()
{
    pid_t pid;
    if(pid = fork() < 0)
        printf("Fork Error.!!!\n");
    else 
    if(pid == 0)
    {
        if((pid = fork()) < 0)
             printf("Fork2 Error.!!!\n");
        else 
             if(pid > 0)
                   exit(0);

        sleep(2);
        printf("Second Child, parent id: %d\n", getppid());
        exit(0);
    }
    if(waitpid(pid, NULL, 0) != pid)
        printf("Waitpid Error.!!!\n");

    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下:

Second Child, parent id: 1
Second Child, parent id: 1
Run Code Online (Sandbox Code Playgroud)

这本书说这应该只打印一次,这也是我觉得当我看到代码中发生了什么时应该发生的事情.我不明白为什么它会被打印两次.我在网上的许多地方发现了这个代码,但无法解释这个问题.欢迎任何帮助.谢谢.!!

小智 5

主要代码的第二行 - 缺少括号 pid = fork()

if( ( pid = fork() ) < 0){
Run Code Online (Sandbox Code Playgroud)


Ala*_*rry 5

在这一行:

if(pid = fork() < 0)
Run Code Online (Sandbox Code Playgroud)

你应该在pid = fork()部件周围添加括号,就像你为另一个fork做的那样.您正在分配的结果fork() < 0pid.只要fork没有失败,这意味着pid在第一个fork的父级和子级中都变为0,所以你得到2个运行子分支的进程(每个进程创建一个自己的子进程)并且没有跑了waitpid.