【发布时间】: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 <stdio.h>来说是个坏主意,因为它还包含#define FILE ... -
@EOF 你是对的,在打开文件后放叉子会导致文件中有两个日期行。但为什么会有所不同呢?
-
@Marc 因为在 Unix 中,有文件 descriptors(你从
open()得到的int)和文件 descriptions,其中是内核中的对应实体。文件 description 包含当前进入文件的偏移量,两个fork()ed 进程中的文件descriptors 引用同一个文件description , 如果他们从同一个open()开始。