我使用opendir/readdir/closedir來重新生成一個類似於ls的程序,直到我試圖在ls「/ dev /」它帶有遞歸選項的「/ dev/fd /」,它找到比它實際存在更多的文件,那些不是隱藏文件(我的意思是'。''開始文件)。 真正的LS給我: 「/ dev/fd /:」 「0 1 2 3」 我也是。 但是,問題是在gdb中,它找到了3個4,5和6的文件。我聽說gdb創建了他自己的環境,所以讓我們把它忘掉吧。 當我嘗試LS 「的/ dev/FD /」 -R,而我的計劃爲真正的LS立即停止上市:readdir(3)奇怪的行爲:在/ dev/
「的/ dev/FD/3:」
「的/ dev/FD/3/3 /」
「/dev/fd/3/3/......../10」
統計返回-1後至少40個文件,但會繼續執行:分段故障。在我的計算機中,「/ dev/fd/3 /」等符號鏈接,宏「S_ISDIR」在現有文件中返回0,但是在非現有文件如:「/ dev/fd/6 /「它返回1 ...
我想知道爲什麼我的程序出現錯誤,而真正的ls沒有,我注意到ls在我的電腦中使用stat64,但是當我這樣做的時候它仍然出錯..它也使用我不知道的fstat64,futex和其他系統調用。
我可以告訴你一些我的代碼或細節樣本更難以解釋,我很抱歉。
謝謝你。
PS:我沒有得到在READDIR手冊頁的發言:「通過READDIR返回的數據可以通過後續調用覆蓋到READDIR爲同一目錄流」
你明白'/ dev'下的文件真的是僞文件,對嗎?特別是,'/ dev/fd'下的文件對應於你當前打開的文件描述符,所以打開一個文件描述符來讀取目錄(通過'opendir(2)')的動作改變了目錄內容。 –
@亞當:這應該是一個答案! – duskwuff
非常感謝我應該更多地閱讀關於文件系統並通過強制不讀這些文件來解決這個問題! – r3dalice