2011-02-01 54 views
1

当调用访问(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. 
     ... 
     } 
    } 
    } 
} 

请注意我的应用程序代码在数千次调用中工作正常,然后我看到了这一次失败。上面的代码是一个简化的综合,直到故障条件的关键成分。

+0

`access`容易出现竞态状况。如果你的目标是创建一个唯一的临时文件,你应该尝试用`O_CREAT |创建文件O_EXCL`并在文件存在时对失败做出反应。那个,或者使用一个生成临时文件的libc函数,而不是试图自己做。 – asveikau 2011-02-01 01:17:29

+0

@asveikau我添加了代码,显示我正在使用mkstemp()来生成临时文件。 – WilliamKF 2011-02-01 01:33:59

回答

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()函数修改文本的工作。

相关问题