我使用getcwd函数来检索我的应用程序的当前工作目录。 在某些情况下,它失败并且errno是ENOENT。我从不同的线程调用getcwd,但是连续地,有时我会面对ENOENT,但我不知道为什么。 上面的链接指出ENOENT意味着“当前工作目录已被取消链接”。但目录存在。为什么getcwd失败errno ENOENT
这里是我使用的功能的一个片段:
UPDATE:代码与@Aganju建议和@molbdnilo更新:
std::string get_working_dir()
{
char buf[PATH_MAX];
memset(buf, 0, sizeof(buf));
char * result = getcwd(buf, sizeof(buf));
std::string working_path = buf;
// Check for possible errors.
if (result == NULL)
{
switch (errno)
{
case EACCES:
break;
case EFAULT:
break;
case EINVAL:
break;
case ENAMETOOLONG:
break;
case ENOENT:
{
if (working_path.empty())
{
const char* pwd = getenv("PWD");
working_path = (pwd) ? pwd : "";
}
break;
}
case ERANGE:
break;
default:
break;
}
return working_path;
}
}
如果我面对ENOENT,检索到 “PWD”环境变量,因为我在CentOS 5.11和Ubuntu 16.04上工作,而当CentOS上的getcwd失败时,它返回一个空的缓冲区。
UPDATE:
我已经注意到了,从主线程调用不会失败,但是当我调用该函数从另一个线程失败和错误号是ENOENT。
在您的进程中运行'strace',可能带有'-f'标志,并观察哪个系统调用返回'ENOENT'。这将是你的第一个线索,可能会发生什么。 –
您需要先检查'getcwd'的返回值。 'errno'没有意义,除非'getcwd'返回一个空指针。 – molbdnilo
我检查了NULL,因为你和@Aganju推荐。在CentOS 5上,'getcwd'返回NULL,errno是ENOENT。我要更新示例代码。 我注意到的一件事是,由于我的应用程序是多线程的,因ENOENT而失败的调用是那些不从主线程调用的调用。 – rboc