getcwd関数を使用して、アプリケーションの現在の作業ディレクトリを取得しています。 場合によっては失敗し、errnoはENOENTです。私は別のスレッドからgetcwdを呼び出しますが、連続してENOENTに直面することもありますが、理由はわかりません。 上記のリンクでは、ENOENTは「現在の作業ディレクトリがリンク解除されています」という意味です。ディレクトリは存在します。getcwdがerrnoで失敗する理由ENOENT
UPDATE::コードは@Aganjuと@molbdniloからのアドバイスを更新:ここで
は、私が使う機能の抜粋である私はENOENTに直面している場合は
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;
}
}
、私は "PWD" を取得します私はCentOS 5.11とUbuntu 16.04で動作し、CentOSでgetcwdが失敗すると空のバッファを返します。
UPDATE:
私はメインスレッドからの呼び出しは失敗しませんが、私は別のスレッドからの関数を呼び出すとき、それは失敗し、errnoにENOENTであることに気づきました。
おそらく '-f'フラグで' strace'を実行し、どのシステムコールが 'ENOENT'を返すかを観察します。これは何が起こっているのかについての最初の手掛かりになります。 –
最初に 'getcwd'の戻り値をチェックする必要があります。 'getcwd'がヌルポインタを返さない限り、' errno'は無意味です。 – molbdnilo
あなたと@Aganjuが推奨するようにNULLをチェックしました。 CentOS 5では 'getcwd'はNULLを返し、errnoはENOENTです。サンプルコードを更新します。 私が気づいたことの1つは、自分のアプリケーションがマルチスレッドであるため、ENOENTで失敗した呼び出しがメインスレッドから呼び出されなかったことです。 – rboc