首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fork()和缓冲IO流

fork()和缓冲IO流
EN

Stack Overflow用户
提问于 2013-11-25 14:00:24
回答 1查看 198关注 0票数 0

缓冲IO流在fork()上有一个奇怪的行为。

在下面显示的示例代码片段中,正在读取的文件大小为252字节。在fork()之后,孩子成功地读取了一行并在屏幕上打印。但是,当控制返回到父进程时,由于某种原因,文件偏移量被设置为文件的末尾,父进程无法从流中读取任何内容。如果fork()创建了一个文件描述符的dup (这在使用系统调用read()write()复制相同的程序时工作得很好),人们会期望父进程从流中读取下一行,但这里似乎没有发生这种情况。当控件到达父级时,文件偏移量设置为文件的末尾。谁能解释一下这件事?

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-26 04:02:59

子进程中的fgets()是完全缓冲的,因为它正在从文件中读取数据。在我的系统上,一个完全缓冲的缓冲区的大小是1024..So,一个read()在fgets()缓冲区中包含文件的全部内容(252字节)。因此,当控件从子级返回到父级时,偏移量将设置为文件的末尾。

在子进程返回之前,在子进程中执行fflush(),可以确保fgets()缓冲区中的数据被丢弃,因此当控件到达父进程时,文件offest会被正确地设置回去。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20185750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档