fork() 使用没有得到正确的输出

发布于 2024-11-06 04:57:56 字数 387 浏览 1 评论 0原文

我正在使用以下代码进行 fork 执行

#include <stdio.h>
#include <sys/types.h>

int main()
{
    int pid;
    pid=fork();
    if(pid==0)
    {
        printf("\n child 1");
        pid=fork();
        if (pid==0)
           printf("\n child 2");
    }
    return 0;
}

我假设的输出应该是 孩子1 child2

相反,我得到了

child1 child2 child1

无法理解分叉行为

I am using the following code for a fork execution

#include <stdio.h>
#include <sys/types.h>

int main()
{
    int pid;
    pid=fork();
    if(pid==0)
    {
        printf("\n child 1");
        pid=fork();
        if (pid==0)
           printf("\n child 2");
    }
    return 0;
}

The output I assume should be
child1
child2

Instead I am getting

child1
child2 child1

Cannot understand the fork behaviour

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

郁金香雨 2024-11-13 04:57:56

如果您在调用 fork 之前已将数据写入任何 stdio FILE,并且打算在 fork 之后使用相同的 FILE,在调用 fork 之前,您必须对该 FILE 调用 fflush。如果不这样做,就会导致未定义的行为

请参阅此处了解正式要求:

http://pubs.opengroup.org/ onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01

具体来说,

请注意,在 fork() 之后,之前存在的句柄处存在两个句柄。应用程序应确保,如果两个句柄都可以访问,则它们都处于另一个可以首先成为活动句柄的状态。应用程序应准备 fork(),就像更改活动句柄一样。 (如果进程之一执行的唯一操作是 exec 函数或 _exit() (不是 exit())之一,则该进程中永远不会访问该句柄。)

If you have written data to any stdio FILE before calling fork and intend to use the same FILE after fork, you must call fflush on that FILE before calling fork. Failure to do so results in undefined behavior.

See here for the formal requirements:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01

Specifically,

Note that after a fork(), two handles exist where one existed before. The application shall ensure that, if both handles can ever be accessed, they are both in a state where the other could become the active handle first. The application shall prepare for a fork() exactly as if it were a change of active handle. (If the only action performed by one of the processes is one of the exec functions or _exit() (not exit()), the handle is never accessed in that process.)

憧憬巴黎街头的黎明 2024-11-13 04:57:56

您需要刷新标准输出:

printf( "\n child 1" )
fflush( stdout );

You need to flush stdout:

printf( "\n child 1" )
fflush( stdout );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文