【问题标题】:Why fflush(input_filestream) does not discard buffer on linux as manpage describes?为什么 fflush(input_filestream) 不会像手册页描述的那样丢弃 Linux 上的缓冲区?
【发布时间】:2019-03-07 07:36:56
【问题描述】:

在 Ubuntu 上的人 fflush

对于与可查找文件相关的输入流(例如,磁盘文件,但不是管道或终端),fflush() 会丢弃任何已从底层文件获取但尚未被应用程序使用的缓冲数据。

我读过一些关于fflush(stdin)fflush() 的问题,根据标准,输入流是未定义的行为,没错。但是特别是对于 Linux,我读过 cmets 说这不是未定义的行为,而是扩展,是的,上面的手册页说明了它将如何在文件输入流上工作。

那么,为什么fflush() 输入文件流不会丢弃 从基础文件中获取但尚未被应用程序使用的缓冲数据。 如手册页所述?

在网上搜索之前,我完全相信手册页现在我想知道它是否错了。


示例代码:

haha2.txt:123456,没有换行符或空格。

#include <stdio.h>

int
main()
{
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    int j2 = getc(fp);// But they can still read data as if fflush does not executed
    int j3 = getc(fp);
    int j4 = getc(fp);

    int j5 = getc(fp);
    int j6 = getc(fp);
    int j7 = getc(fp);
    int j8 = getc(fp); 
    printf("%c,%c,%c,%c,%c,%c,%c,%c\n", j,j2,j3,j4,j5,j6,j7,j8);
    return(0);
}

【问题讨论】:

  • 为什么你认为丢弃缓冲数据会阻止缓冲区再次被填充?
  • 这种fflush 行为是特定于Linux 的。为什么不用ungetc
  • @Rick :如果在刷新时,缓冲区包含“123”(您的应用程序尚未读取),并且输入流没有发生任何其他事情,则后续读取应该填充缓冲区再次以“123 ...”开头
  • 你能澄清你到底在问什么吗?您是否试图理解为什么行为与您的期望不符?或者您是否试图让行为符合您的期望?
  • 我什至看不到在磁盘文件上使用fflush 的意义(该文件仍未被写入)。仅对我作为 user3386109 的我来说,清除不需要的键盘输入才有意义:例如,如果您问了一个重要问题并且您想确保没有预先输入缓冲。

标签: c linux fflush


【解决方案1】:

刷新文件缓冲区只会丢弃缓冲区中的数据。它不会影响文件的内容。随后的读取将继续读取文件,就好像什么都没发生一样(除了首先必须再次填充缓冲区)。

当然,这是假设文件在此期间没有发生任何事情(例如,某些其他进程覆盖文件的一部分、截断文件等)。

为了说明,如果您修改代码以在 fflush 之后包含 sleep

#include <stdio.h>
#include <unistd.h>

int main() {
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    sleep(10);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    printf("%d\n", j);
    return(0);
}

当您运行此代码时,在另一个终端中,您在睡眠期间运行此命令(此命令将从文件中删除所有内容并将其大小设置为 0):

truncate -s0 haha2.txt

然后代码会打印-1(因为已经到了文件的末尾)。

如果您再次尝试相同的操作(确保首先将您的测试数据添加回文件中),但这次没有fflush,代码将打印文件中的第二个字符,因为文件的开头仍处于缓冲状态(即使实际文件不再包含任何内容)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2018-05-31
  • 2013-09-19
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多