fork() 不等待 child

fork() not waiting for child

我认为等待暂停主执行直到 child 进程完成。


以下是我期望在控制台中看到的内容。

我是 ID 为 12833 的 parent <- parent

我先打电话给 id 0 <- child

我在 wait()

之后先用 ID 12833 <- parent 打电话

相反,我看到了这个... #控制台输出

我是 parent id 12833

我先打电话给 id 12833

我先用 id 0 打电话


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{

    int id = fork();

    if(id!=0){
        //
        printf("I am the parent with id %d\n",id);
        wait(); //my code has no respect for wait()
    }

    printf("I'm calling first with id %d\n",id);


    return 0;
}

我的输出是

I'm calling first with id 0
I am the parent with id 29807
I'm calling first with id 29807

您不应依赖缓冲输出。检查 wait.

的返回值
int main(int argc, char* argv[])
{
    int id = fork();

    if(id!=0){
        printf("I am the parent with id %d\n", id);
        int wstatus = 0;
        if (wait(&wstatus) != -1) //my code has no respect for wait()
            printf("I am the parent with id %d and my child exited\n", id);
    }
    else
    {
        printf("I'm child\n");
    }

    return 0;
}

由于缓冲输出,输出又不是您所期望的。

I'm child
I am the parent with id 18057
I am the parent with id 18057 and my child exited

如果您刷新输出缓冲区,您将获得所需的输出:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    int id = fork();

    if(id!=0){
        printf("I am the parent with id %d\n", id);
        fflush(stdout);
        int wstatus = 0;
        if (wait(&wstatus) != -1) //my code has no respect for wait()
        {
            printf("I am the parent with id %d and my child exited\n", id);
            fflush(stdout);
        }
    }
    else
    {
        printf("I'm child\n");
        fflush(stdout);
    }

    return 0;
}

产出

I am the parent with id 21487
I'm child
I am the parent with id 21487 and my child exited