gpt4 book ai didi

c - 将打印多少 XD?

转载 作者:太空狗 更新时间:2023-10-29 11:08:44 27 4
gpt4 key购买 nike


当我和我的一个 friend 一起玩 fork() 时,我遇到了这个奇怪的问题。非常简单的 POC 代码喜欢:

int main(int argc, char** argv)
{
int i = 0;
for(i=0; i<4; i++) {
printf("xd\n");
fork();
}
return 0;
}

我得到了一个漂亮的输出:
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd
xd 已经打印了 15 次,这是我所期望的 - 4 级完全二叉树中的节点数。但是,当我们删除 printf 中的“\n”时,我们得到了另一个完全不同的结果:


它给了我 64 个 XD(我 friend 的机器上有 56 个 XD)。这似乎是一个有点“稳定”的结果,因为我可以多次运行它并且它给我相同的结果(与我 friend 的相同)。

我尝试将 printf("xd") 更改为 perror("xd"),它给了我 15 个输出:
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
xd:成功
我试过了

    for(i=0; i<4; i++) {
printf("xd");
fflush(stdout);
fork();
}

这将给我一行 15 个 XD。
我敢打赌这与输出缓冲区有关,但我无法解释。
我有两个天真的猜测,一个是认为它是经典的并发问题,但我很快就否认了,因为 fork() 创建了另一个进程而不是线程,每个子进程实际上持有 i 的不同副本。 (如有错误请指正)
另一个天真的猜测是,当多个进程写入同一个 stdout 时,缓冲区中的内容已显示在屏幕上但在从缓冲区中清除之前,如果另一个进程向缓冲区写入内容,它将停止清理它/将整个缓冲区视为有效。
这两个很可能是错误的,因为我对Linux实现知之甚少,谁能帮我解释一下?

最佳答案

您所关注的行为是因为缓冲模式。

因为末尾没有换行并且输出以行缓冲模式运行(或全缓冲模式)这就是你看到的输出不同的原因

你必须使用 fflush(0); 在 fork 之前清空所有 I/O 缓冲区

您可以通过标准 C 函数 setvbuf()_IOFBF(全缓冲)、_IOLBF(行缓冲)控制缓冲模式) 和 _IONBF(无缓冲)模式。

关于c - 将打印多少 XD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26397595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com