【问题标题】:fwrite doesn't fail when disk is full?磁盘已满时 fwrite 不会失败?
【发布时间】: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 上,这是否会被视为一个错误。

【问题讨论】:

    标签: glibc fwrite tmpfs


    【解决方案1】:

    数据未成功写入磁盘

    标准没有谈论磁盘。它谈到数据被成功写入流(它已经被)。

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

    很有可能。

    这会被认为是一个错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2018-12-31
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多