磁盘已满时,fwrite不会失败?

时间:2017-11-21 20:17:56

标签: glibc fwrite tmpfs

这是我写的测试程序

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的所有版本是否会发生这种情况,这会被认为是一个错误。

1 个答案:

答案 0 :(得分:0)

  

数据未成功写入磁盘

标准没有谈论磁盘。它讨论了成功写入的数据(已经存在)。

  

我想知道是否所有版本的glibc

都会发生这种情况

最有可能。

  

这会被视为一个错误。

这是您对fwrite上的要求的解释中的错误。