c - Unix中的fork函数
问题描述
我在 c 中创建了一个简单的 fork 程序
printf("first");
fork();
printf("second");
我了解到 fork 函数创建了一个从下一条指令执行的子进程,它应该像
firstsecondsecond
但我得到的输出是
firstsecondfirstsecond
我错了吗?
解决方案
请记住,输出到stdout
(printf
写入的地方)是缓冲的。更具体地说,默认情况下(当输出到终端时)行缓冲,这意味着缓冲区在换行符上刷新。
现在这里发生的是第一个printf
调用写入"first"
输出缓冲区,但它没有被刷新。然后你 fork,它会创建一个完全相同的进程副本,包括stdout
缓冲区。然后两个进程都打印"second"
。
在那之后,大概两个进程都结束了,这导致stdout
被刷新和关闭。这会刷新两个进程中缓冲区的内容,这些内容将包含完全相同的数据,从而产生您获得的输出。
如果您在调用之前显式刷新缓冲区fork
(例如通过打印换行符或调用fflush(stdout)
),则行为应该如您所愿。
推荐阅读
- javascript - 如何使用 Node & Express 启动我的 MYSQL 数据库?
- gradle - 如何在 gradle 中包含 sprint 云依赖项
- javascript - 如何在触发的单元格中自动添加包含单元格历史记录的注释?
- angular - 如何在 SharePoint 上托管 Angular Web 应用程序
- javascript - 获取数组对象中的连续元素
- c++ - 在 C++ 中使用 RAII 在线程包装类中移动语义
- javascript - AJAX 切换 HTML
- entity - 如何在 EFCore 3.1 中使用脚手架流程更新我的实体 - 执行超时已过期
- python - 如何在python数据框中取消嵌套元组
- python - 在 ImageNet 示例代码中使用 Pytorch 分配特定 GPU