c - C 中的 fork——令人困惑的输出
问题描述
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
fork();
printf("Hello");
fork();
return 0;
}
这里的代码打印 Hello 而不使用 '\n' 输出: HelloHelloHelloHello
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
fork();
printf("Hello\n");
fork();
return 0;
}
这里的代码打印 Hello 和 \n 输出:
Hello
Hello
解决方案
@Stolenmoments 的怀疑是正确的。
基本上,第一个printf
语句stdin
用一些数据填充缓冲区,第二个 fork 复制stdin
缓冲区。当所有程序退出时,它们都会刷新它们的缓冲区。
要查看未打印的孙叉,我们可以像这样扩展您的程序:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int childpid = fork();
printf("%s %d, ", "Hello", childpid);
childpid = fork();
return 0;
}
并且我们得到输出Hello 11221, Hello 0, Hello 11221, Hello 0,
显然childpid
第二个 fork 的 s 是不一样的,否则它们不会是 fork 进程。
但是只要我们添加一个fflush
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
fork();
printf("Hello");
fflush(stdout);
fork();
return 0;
}
我们得到了预期的输出HelloHello
推荐阅读
- symfony - Symfony REST API。我需要表格吗?
- python - 如何在 Kivy 中更新 StringProperty 变量
- ember.js - 如何根据 promise 返回数据
- php - 如何使用 PHP 在带有 Times 字体的 .pdf 中添加货币符号(卢比符号)
- python - 在 Windows 上的任务计划程序中计划并手动运行 .pyw 脚本
- batch-file - 将多个音频文件加入/连接成 1 个音频文件
- javascript - js语法的静态分析
- c# - 在 UWP 应用中获取 BrightnessLevel 时的问题
- typescript - 无服务器:并非所有打字稿文件都编译在同一目录中
- javascript - 为什么数据没有渲染到 react 和 redux 的模板中?