当调用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.
...
}
}
}
}
请注意我的应用程序的代码在数千次调用中运行良好,然后我看到这一次失败。上面的代码是一个简化的综合,直到失败条件的关键成分。
答案 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()
函数具有可修改的文本。