【发布时间】:2014-10-08 12:41:48
【问题描述】:
我正在学习内核缓冲区并了解当我们写入文件时,即使在刷新后也不一定会立即进入文件;它被放入内核缓冲区,稍后将被刷新。显然我们可以调用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 打开控制台的输出,这将是必需的...
有人能解释一下发生了什么吗?提前致谢。
【问题讨论】:
-
fflush 用于流,fsync 用于文件。
-
不知道你在这里得到了什么。
fflush刷新用户空间缓冲区,而fsync刷新内核缓冲区。被刷新的东西可以是流或文件...
标签: c++ linux-kernel