从两个子进程写入同一文件

时间:2018-12-04 21:50:43

标签: c linux file-io

以下代码:

#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。因此,我希望在文件中看到两行,每个子进程一行。为什么没有发生?

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

在第二个O_APPEND上设置open()将为您带来预期的结果。

(顺便说一句,不要在您的预处理程序宏中使用名称FILE。它已经在<stdio.h>中定义为类型。)