这是我写的一个测试程序
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 上,这是否会被认为是一个错误。