【问题标题】:Writing to the same file from two child processes从两个子进程写入同一个文件
【发布时间】:2018-12-04 21:50:43
【问题描述】:

以下代码:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

#define FILE "out.txt"

int main() { 
  // Creates an empty file
  close(open(FILE, O_WRONLY|O_TRUNC|O_CREAT, 0600));

  fork();

  close(1);
  open(FILE, O_WRONLY);

  execlp("date", "date", NULL);
}

创建一个名为 out.txt 的文件,其内容如下:

Tue  4 Dec 21:21:54 GMT 2018

我不明白为什么日期和时间只有一行。

我的期望是两个子进程中的每一个都应该关闭它们各自的标准输出文件描述符,并且现在它们是空闲的,将它们重新分配给 out.txt。所以我希望在文件中看到两行,一个来自每个子进程。为什么不会发生这种情况?

提前感谢您的帮助。

【问题讨论】:

  • 他们都从文件的开头开始写?
  • 因为你open()fork()
  • #define FILE#include &lt;stdio.h&gt; 来说是个坏主意,因为它还包含#define FILE ...
  • @EOF 你是对的,在打开文件后放叉子会导致文件中有两个日期行。但为什么会有所不同呢?
  • @Marc 因为在 Unix 中,有文件 descriptors(你从 open() 得到的 int)和文件 descriptions,其中是内核中的对应实体。文件 description 包含当前进入文件的偏移量,两个fork()ed 进程中的文件descriptors 引用同一个文件description , 如果他们从同一个 open() 开始。

标签: c linux file-io


【解决方案1】:

open(FILE, O_WRONLY); 将偏移量放在文件的开头。两个进程都将当前日期写入文件的开头——其中一个将覆盖另一个,但由于它们都在写入相同的字符串,因此无法检测到。

在第二个open() 上设置O_APPEND 将获得您期望的结果。

(顺便说一句,不要将名称 FILE 用于您的预处理器宏。它已在 &lt;stdio.h&gt; 中定义为类型。)

【讨论】:

  • 如果我将命令 fork(); 移动到 open(FILE, O_WRONLY); 之后,它确实会写入两次日期。这是为什么呢?
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多