【发布时间】:2017-11-21 20:17:56
【问题描述】:
这是我写的一个测试程序
int main( int argc, const char* argv[] )
{
const char name[1024] = "/dev/shm/test_file";
off_t len = atol(argv[argc - 1]);
char buf[1024];
FILE * f = fopen(name, "w");
for (int i = 0; i < len; i++) {
int ret = fwrite(buf, 1024, 1, f);
if (ret != 1) {
printf("disk full\n");
}
}
if ( fclose(f) != 0)
printf("failed to close\n");
return 0;
}
我试图将 /dev/shm 填满
tmpfs 36G 36G 92K 100% /dev/shm
然后跑了
$ ./a.out 93
failed to close
我的 glibc
$ /lib/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
内核版本为2.6.32-642.13.1.el6.x86_64
我了解此行为是由于 fwrite 尝试将数据缓存在内存中造成的。 (我试过 setvbuf(NULL...) 和 fwrite 立即返回失败)。但这似乎与定义有点不同
fwrite() 函数应成功返回元素的数量 写入,如果写入错误,它可能小于 nitems 遭遇。如果 size 或 nitems 为 0,fwrite() 将返回 0 并且 流的状态保持不变。否则,如果写入错误 发生时,应设置流的错误指示符,[CX] [Option Start] 和 errno 应设置为指示错误。 [选项结束]
数据未成功写入磁盘,但返回值为 1。未设置 errno。 在这个测试用例中, fclose 捕获了失败。但它甚至可能被一个相当混乱的 ftell 函数捕获。
我想知道这是否发生在所有版本的 glibc 上,这是否会被视为一个错误。
【问题讨论】: