刷新stdout的内核缓冲区

时间:2014-10-08 12:41:49

标签: c++ linux-kernel

我正在学习内核缓冲区并理解当我们写入文件时,即使在刷新之后它也不一定立即进入文件;它被放入一个内核缓冲区,稍后将被刷新。显然我们可以调用fsync()来刷新内核缓冲区,所以我按如下方式进行了实验:

/* This works fine, nRet is 0 */
FILE* file = fopen("MyFile", "w");
fprintf(file, "1234");
fflush(file);
int nRet = fsync(fileno(file));

/* This doesn't work, nRet is -1 and errno is 22 (Invalid argument)*/
fprintf(stdout, "Output to standard out");
fflush(stdout);
int p = fileno(stdout);
nRet = fsync(p);

我完全清楚我们并不需要刷新内核缓冲区,但这纯粹是一种学习经验。

我找不到任何说明fsync()不能用于标准输出的内容;当然,它必须要做,因为我们可能希望为控制台提供超快速更新,在这种情况下,如果我们没有使用O_SYNC打开输出到控制台,则需要这样做...

有人可以解释一下发生了什么吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

documentation说:

  

<强> EINVAL
   fd 绑定到不支持的特殊文件   同步。

控制台设备不是普通文件,没有内核缓冲区;任何写入都由控制台驱动程序立即处理。 如果不是这种情况,那么这样的代码将不起作用:

printf("Please enter something: ");
scanf(...);