私は opendir / readdir / closedir を使用して ls に似たプログラムを再現しています。再帰オプションを使用して「/dev/fd/」になると、「/dev/」を ls しようとするまではうまくいきました。ファイルが実際に存在するよりも多く、それらは隠しファイルではありません (「.」ファイルの開始を意味します)。本当の ls は私に : "/dev/fd/ :" "0 1 2 3" 私もそうです。しかし、問題は、gdb で、4、5、6 の 3 つのファイルをさらに見つけることです。gdb は独自の環境を作成すると聞いたので、これは忘れましょう。ls "/dev/fd/" -R を試すと、真の ls はすぐにリストを停止し、プログラムは次のようになります。
「/dev/fd/3:」
「/dev/fd/3/3/」
「/dev/fd/3/3/......../10」
stat は、少なくとも 40 個のファイルの後に -1 を返しますが、実行は継続します: セグメンテーション違反。
私のコンピューターでは、「/dev/fd/3/」とシンボリックリンクがあり、マクロ「S_ISDIR」は既存のファイルでは0を返しますが、「/dev/fd/6/」のような存在しないファイルでは返します1...
本当の ls はそうではないのに、なぜ私のプログラムがうまくいかないのか知りたかったのですが、ls は自分のコンピューターで stat64 を使用していることに気付きましたが、それでもうまくいかないことに気付きました.. fstat64、futex など、私が使用していない syscall も使用します知る。
コードのサンプルや詳細をお見せできますが、説明するのが本当に難しいので、申し訳ありません。
ありがとうございます。
PS : readdir マンページでそのステートメントを取得しません:「readdir によって返されたデータは、同じディレクトリ ストリームの readdir への後続の呼び出しによって上書きされる可能性があります」