当调用访问(2),却得到了错误号== ENOENT手册页说: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.
...
}
}
}
}
请注意我的应用程序代码在数千次调用中工作正常,然后我看到了这一次失败。上面的代码是一个简化的综合,直到故障条件的关键成分。
`access`容易出现竞态状况。如果你的目标是创建一个唯一的临时文件,你应该尝试用`O_CREAT |创建文件O_EXCL`并在文件存在时对失败做出反应。那个,或者使用一个生成临时文件的libc函数,而不是试图自己做。 – asveikau 2011-02-01 01:17:29
@asveikau我添加了代码,显示我正在使用mkstemp()来生成临时文件。 – WilliamKF 2011-02-01 01:33:59