这是我写的测试程序
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] [选项 开始]和errno应设置为指示错误。 [选项结束]
数据未成功写入磁盘,但其返回值为1.没有设置errno。 在这个测试用例中,fclose捕获失败。但它甚至可能被一个令人困惑的ftell功能所捕获。
我想知道glibc的所有版本是否会发生这种情况,这会被认为是一个错误。
答案 0 :(得分:0)
数据未成功写入磁盘
标准没有谈论磁盘。它讨论了成功写入流的数据(已经存在)。
我想知道是否所有版本的glibc
都会发生这种情况
最有可能。
这会被视为一个错误。
这是您对fwrite
上的要求的解释中的错误。