我正在学习内核缓冲区并理解当我们写入文件时,即使在刷新之后它也不一定立即进入文件;它被放入一个内核缓冲区,稍后将被刷新。显然我们可以调用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
打开输出到控制台,则需要这样做...
有人可以解释一下发生了什么吗?提前谢谢。
答案 0 :(得分:1)
<强> EINVAL 强>
fd 绑定到不支持的特殊文件 同步。
控制台设备不是普通文件,没有内核缓冲区;任何写入都由控制台驱动程序立即处理。 如果不是这种情况,那么这样的代码将不起作用:
printf("Please enter something: ");
scanf(...);