fork()和缓冲IO流

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

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

在下面显示的示例代码段中,正在读取的文件大小为252字节。在
fork()
之后,孩子正在成功地读取一行并在屏幕上打印。但是,当控件返回到父级时,由于某种原因,文件偏移量被设置为文件末尾,并且父进程无法从流中读取任何内容。如果
fork()
创建了一个文件描述符的dup(使用系统调用
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);
    }
}
子进程中的fgets()在从文件读取数据时被完全缓冲。在我的系统上,完全缓冲的缓冲区大小为1024..因此,单个read()在fgets()缓冲区中包含文件的全部内容(252字节)。因此,当控件从子控件返回到父控件时,偏移量设置为文件的结尾

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