缓冲的IO流在fork()
上有一种奇怪的行为。
在下面显示的示例代码段中,正在读取的文件大小为252字节。在fork()
之后,孩子正在成功阅读一条线并在屏幕上打印。但是,当控件返回到父级时,由于某种原因,文件偏移量被设置为文件末尾,并且父进程无法从流中读取任何内容。如果fork()
创建了一个文件描述符的副本(使用系统调用read()
和write()
复制相同的程序可以正常工作),可以预期父进程从下一行读取流,但似乎没有发生在这里。当控件到达父级时,文件偏移量设置为文件末尾。有人可以对此有所了解吗?
int main(void)
{
char buffer[80];
FILE *file;
pid_t pid;
int status;
/* Open the file: */
file = fopen(FILENAME, "r");
if ((pid = fork()) == 0){
fgets(buffer, sizeof(buffer), file);
printf("%s", buffer);
}
else{
waitpid(pid, &status, 0);
printf("Offset [%d]\n", ftell(file));
fgets(buffer, sizeof(buffer), file);
printf("%s", buffer);
}
}
答案 0 :(得分:0)
fgets()完全缓冲,因为它正在从文件中读取数据。在我的系统上,一个完全缓冲的缓冲区大小为1024.因此,单个read()在fgets()缓冲区中包含文件的全部内容(252个字节)。因此,当控件从子节点返回到父节点时,偏移量将设置为文件的末尾。
在子进程返回之前执行fflush()可确保丢弃fgets()缓冲区中的数据,因此当控件到达父进程时,会正确设置文件offest。