为了账号安全,请及时绑定邮箱和手机立即绑定

fork()分支比预期更多?

fork()分支比预期更多?

C++ C
眼眸繁星 2019-11-25 13:52:09
考虑以下代码:#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(void){    int i;    for(i = 0; i < 2; i++)    {        fork();        printf(".");    }    return 0;}该程序输出8个点。那怎么可能呢?应该不应该有6个点?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

fork()原始常常延伸的想象力。在您对它有所了解之前,应该在纸上找出每个操作的含义并说明处理的数量。不要忘记fork()创建了当前进程的近乎完美的副本。(对于大多数用途而言)最重要的区别是,fork()父级和子级的返回值不同。(由于此代码忽略了返回值,因此没有区别。)

因此,起初只有一个过程。这将创建第二个过程,这两个过程都将打印点和循环。在第二次迭代中,每个进程都会创建另一个副本,因此有四个进程先打印一个点,然后退出。因此,我们可以轻松地说明六个点,就像您期望的那样。

但是,printf()真正的作用是缓冲其输出。因此,只有两个进程时的第一个点在写入时不会出现。这些点保留在缓冲区中,该缓冲区在fork()中重复。直到该过程即将退出时,才会出现缓冲点。四个过程打印一个缓冲点,新的过程给出8个点。

如果您想避免这种情况,请fflush(stdout);在之后致电printf()


查看完整回答
反对 回复 2019-11-25
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您在输出流中有未提交的缓冲区。stdout是行缓冲的,缓冲区与其余过程一起复制。程序终止时,未提交的缓冲区被写入两次(每个进程一次)。两者都使用


printf("a\n");


printf("a "); fflush(stdout);

不要表现出问题。


在第一个示例中,您创建了四个进程,每个进程的输出流缓冲区中都有两个点。当每个流终止时,它将刷新其缓冲区,生成八个点。


查看完整回答
反对 回复 2019-11-25
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

当我= 0时


处理_1:缓冲的文本= 1点


Process_2(由Process_1创建):缓冲的文本= 1点


当我= 1


Process_3(由Process_1创建):从Process_1继承1个缓冲点,并单独打印1个点。总共Process_3打印2个点。


Process_4(由Process_2创建):从Process_2继承1个缓冲点,并自行打印1个点。总共Process_4打印2个点。


Process_1:打印2个点(当i = 0时一个缓冲点,而i = 1时另一个缓冲点)


Process_2:打印2点(i = 0时一个缓冲点,i = 1时另一缓冲点)


最终输出:8点。:)


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 551 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信