ENOENT可以表示分区上的文件太多了吗?

时间:2011-02-01 01:01:54

标签: c++

当调用access(2)并获得errno == ENOENT时,手册页显示:

   ENOENT A directory component in pathname would have been accessible but
          does not exist or was a dangling symbolic link.

但是,在我的情况下,我试图在/ tmp /中创建一个文件,并且目录组件是可访问的并且存在。当文件系统在目录中有太多文件时,是否也会给出ENOENT?就我而言,/ tmp /已经发展成为大量的小型临时文件。我可以最终达到极限并获得此ENOENT吗?如果是这样,我该如何以编程方式区分这种情况?

- 添加了更多精简代码和更多解释 -

仔细观察,似乎该文件存在于磁盘上,但如果是这种情况,为什么mkstemp()会给我一个碰撞?我怀疑我能否用尽XXXXXX空间,36 ^ 6 = 21亿!

char *fileName = new char[256];

strncpy(fileName, "/tmp/somePathXXXXXX", 255);

int fileDescriptor = mkstemp(fileName);

if (fileDescriptor == -1) {
  struct stat statusFileInfo;
  int result = stat(fileName, &statusFileInfo);

  if (result == 0) {
    mode_t mode = statusFileInfo.st_mode;

    if (S_ISREG(mode)) {
      // Check permission.
      int result = access(fileName, W_OK);

      if (result) {
        // Code landed here with errno == ENOENT.
        ...
      }
    }
  }
}

请注意我的应用程序的代码在数千次调用中运行良好,然后我看到这一次失败。上面的代码是一个简化的综合,直到失败条件的关键成分。

1 个答案:

答案 0 :(得分:2)

ENOENT的主要含义是“没有这样的文件或目录”。这意味着您尝试access()的名称不存在。

如果您正在尝试创建该文件,那么也许,当目录中存在“文件太多”时,您会得到ENOENT,但我认为您更可能会遇到其他错误 - 也许如果您的inode表出现问题,ENOSPC(设备上没有剩余空间)。


自从我编写答案的第一部分以来出现的代码需要更正。

char *fileName = "/tmp/somePathXXXXXX";
int fileDescriptor = mkstemp(fileName);

你很幸运 - 或者说不幸 - 这不会导致分段错误。这绝对不是调用mkstemp()或任何相关功能的正确方法。您必须传递一个可修改的字符串,这是一个字符串常量,因此不可修改。它可能存储在只读存储器中。看起来你已经逃脱了它 - 但是在第二次调用时,你传递的是一个没有6个X的字符串(因为mkstemp()第一次在X上写了)。因此,难怪文件已经存在。

如果你打算这样玩,你必须使用相当于:

的东西
const char refFileName[] = "/tmp/somePathXXXXXX";
char fileName[32];
strcpy(fileName, refFileName);
int fd = mkstemp(fileName);

现在mkstemp()函数具有可修改的文本。