为什么realpath()返回错误EEXIST
Why does realpath() return error EEXIST?
我的程序在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
文件的绝对路径: - 文件的相对路径:
../../charlie/foo.txt
- 有一个额外点的文件路径:
/alpha/bravo/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;
}
如果没有特别的原因,你永远不应该检查errno
。
也许realpath
的内部操作在EEXIST
上失败了。或者errno
碰巧是之前操作失败的EEXIST
, realpath
没有改变它。
如果这不会导致realpath
失败,为什么你要关心?
从你自己的链接:
在成功完成后,realpath()将返回一个指向解析名称的指针。否则, realpath()将返回一个空指针并设置errno表示错误,并且resolved_name所指向的缓冲区的内容是未定义的。
注意,如果realpath
成功,它没有说errno
被设置为任何特别的东西。那么为什么在检查realpath
是否成功之前先检查errno
呢?
也就是说,您不应该通过检查'errno'值来认为realpath()失败/成功,您应该检查其返回值是否为NULL。如果返回NULL,则可以检查'errno'以查找根本原因。换句话说,如果realpath()成功,它可能不会更改/重置/清除'errno'值-为其分配0。只有当失败时,它才会设置'errno'作为错误码。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 为什么realpath()返回错误EEXIST