为什么realpath()返回错误EEXIST?

Mik*_*nch 3 c++ error-handling realpath

我的程序在Linux环境中运行,使用gcc 4.4.7版编译.

我正在使用realpath()"规范化"文件路径.我提供的每个目录和文件的路径realpath()肯定存在,这当然对于realpath()正常工作至关重要.

但是,有时realpath()会失败,错误代码为17,名称EEXIST,字符串描述"文件存在".

那令我困惑.当然它存在,我尖叫realpath().但是realpath()我的咆哮无动于衷.

文档realpath()http://pubs.opengroup.org/onlinepubs/009695399/functions/realpath.html列出了导致失败的错误,但EEXIST不是其中之一.

为什么这样realpath()失败?

导致EEXIST错误的目录和文件路径的示例:

  • 目录的绝对路径: /alpha/bravo/charlie/delta
  • 文件的绝对路径: /alpha/bravo/charlie/foo.txt
  • 文件的相对路径: ../../charlie/foo.txt
  • 文件的路径,其中包含一个额外的点: /alpha/bravo/Charlie/./foo.txt

但这些示例并不是确定的,因为具有完全相同模式的其他文件在同一目录中将会成功.

对于哪个目录或文件将导致EEXIST错误,似乎没有任何押韵或理由.该错误通常仅发生在我尝试规范化的第一个文件路径上,然后不适用于后续文件路径.但是,我不能仅仅通过尝试再次规范化第一个文件来克服它; 错误将继续发生.

程序片段:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>    // for PATH_MAX

using std;

string PathCanonicalize( string const & path )
{
  string result;

  char szResult[ PATH_MAX ];
  ::realpath( path.c_str(), szResult );
  if ( errno == EEXIST )
  {
    // Why?
    cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'.  Of course the file exists!" << endl;

    result = path;
  }
  else if ( errno )
  {
    cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'" << endl;

    result = path;
  }
  else
  {
    result = szResult;
  }

  return result;      
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 5

你永远errno不应该在没有特定原因的情况下进行检查.

也许realpath上次发生的任何内部操作都失败了EEXIST.或者可能errno碰巧EEXIST来自之前的一些操作失败并realpath没有改变它.

如果这不会导致realpath失败,你为什么关心?

从您自己的链接:

成功完成后,realpath()将返回指向已解析名称的指针.否则,realpath()将返回空指针并设置errno以指示错误,并且resolve_name指向的缓冲区的内容未定义.

请注意,errno如果realpath成功,则不会将其设置为任何特定内容.那么为什么errno在检查是否realpath成功之前检查?