在分支多个进程时如何使用wait()函数?

时间:2010-02-16 05:46:44

标签: c fork pipe wait

学习使用fork()命令以及如何在父项及其子项之间管道数据。我目前正在尝试编写一个简单的程序来测试fork和pipe函数的工作方式。我的问题似乎是等待函数的正确使用/放置。我希望父母等待其两个孩子完成处理。这是我到目前为止的代码:

int main(void)
{
    int n, fd1[2], fd2[2];
    pid_t pid;
    char line[100];

    if (pipe(fd1) < 0 || pipe(fd2) < 0)
    {
        printf("Pipe error\n");
        return 1;
    }

    // create the first child
    pid = fork();

    if (pid < 0)
        printf("Fork Error\n");
    else if (pid == 0)  // child segment
    {
        close(fd1[1]);  // close write end
        read(fd1[0], line, 17); // read from pipe
        printf("Child reads the message: %s", line);

        return 0;
    }
    else    // parent segment
    {
        close(fd1[0]);  // close read end
        write(fd1[1], "\nHello 1st World\n", 17);   // write to pipe

        // fork a second child
        pid = fork();

        if (pid < 0 )
            printf("Fork Error\n");
        else if (pid == 0) // child gets return value 0 and executes this block
            // this code is processed by the child process only
        {
            close(fd2[1]);  // close write end
            read(fd2[0], line, 17); // read from pipe
            printf("\nChild reads the message: %s", line);
        }
        else
        {
            close(fd2[0]);  // close read end
            write(fd2[1], "\nHello 2nd World\n", 17);   // write to pipe

            if (wait(0) != pid)
                printf("Wait error\n");
        }

        if (wait(0) != pid)
            printf("Wait error\n");

    }

    // code executed by both parent and child
    return 0;
}   // end main

目前我的输出看起来像是:

./fork2 
Child reads the message:  Hello 1st World 
Wait error

Child reads the message:  Hello 2nd World 
Wait error

让父母等待的适当位置在哪里?

谢谢,

托梅克

2 个答案:

答案 0 :(得分:4)

这似乎很好(我没有运行它,请注意)。你的逻辑错误是假设孩子们会以某种特定的顺序结束;不要检查wait(0)针对特定pid的结果,除非您确定知道哪一个会回来!

编辑:

我跑了你的程序;您确实至少有一个错误,您的第二个子进程调用wait(),您可能不想这样做。我建议将一些代码分解为函数,这样您就可以更清楚地看到正在执行的操作顺序,而不会造成任何混乱。

答案 1 :(得分:0)

我认为最好使用这样的东西,以便等待所有孩子。

int stat;
while (wait(&stat) > 0)
   {}