lstat(2)のマニュアルページを見ると、ENOENT(ファイルが存在しない)以外のエラーで失敗する可能性がある場合のヒントが得られます。
最も明白なものは次のとおりです。
EACCES
検索許可がパスの接頭辞でのディレクトリのいずれかのために拒否されたパス。
したがって、検索できないディレクトリが必要です。
はい、システムにすでにあるものを探すことができます(おそらく/var/lib/private
存在するのでしょうか?)しかし、次のものと同等の、自分で作成することもできます。
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
ここでは、lstat(2)操作はEACCESで失敗します。(ディレクトリからすべてのアクセス許可をchmod -x
削除すると、ディレクトリの実行アクセス許可がその下にあるファイルにアクセスするために必要になるため、それほど多くの必要はなく、実行アクセス許可を削除するだけで十分かもしれません。)
manページを見て、lstat(2)を失敗させる別の創造的な方法があります。
ENOTDIR
のパス接頭辞のAコンポーネントのパスはディレクトリではありません。
したがって、/etc/passwd/nonexistent
このエラーを引き起こすはずのようなファイルにアクセスしようとすると、ENOENT( "No such file or directory")とは異なり、ニーズに合うかもしれません。
もう一つは:
ENAMETOOLONG
パスが長すぎます。
しかし、これには本当に長い名前が必要な場合があります(4,096バイトが典型的な制限であると信じていますが、システム/ファイルシステムにはもっと長い名前があるかもしれません)。
最後に、これらのどれが実際に役立つかを判断するのは困難です。「ファイルが存在しない」シナリオを引き起こさない何かが欲しいと言います。通常これはENOENTエラーを意味しますが、実際には多くの高レベルのチェックは単にlstat(2)からのエラーを「存在しない」と解釈します。たとえば、シェルからtest -e
の同等のもの[ -e ...]
は、上記のすべてを単に「存在しない」と解釈するだけです。特に、異なるエラーメッセージを返す良い方法がなく、エラーを返さないとファイルが存在することを意味します。確かにそうではありません。
/etc/shadow