0

这是我写的一个测试程序

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 上,这是否会被认为是一个错误。

4

1 回答 1

0

数据未成功写入磁盘

该标准没有谈论磁盘。它讨论了数据被成功写入(它一直是这样)。

我想知道这是否发生在所有版本的 glibc

最有可能的。

这会被认为是一个错误。

这是您对fwrite.

于 2017-11-22T05:24:25.563 回答