【问题标题】:fork() and buffered IO streamsfork() 和缓冲的 IO 流
【发布时间】:2013-11-25 06:00:24
【问题描述】:

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

在下面显示的示例 sn-p 中,正在读取的文件大小为 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);
    }
}

【问题讨论】:

    标签: io fork buffered


    【解决方案1】:
    子进程中的

    fgets() 在从文件中读取数据时被完全缓冲。在我的系统上,一个完全缓冲的缓冲区大小为 1024 ..所以单个 read() 在 fgets() 缓冲区中具有文件的全部内容(252 字节)。因此,当控件从子级返回父级时,偏移量设置为文件末尾。

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

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2012-01-19
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多