2011-08-03 43 views
0
找到不存在的文件

我使用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爲同一目錄流」

+2

你明白'/ dev'下的文件真的是僞文件,對嗎?特別是,'/ dev/fd'下的文件對應於你當前打開的文件描述符,所以打開一個文件描述符來讀取目錄(通過'opendir(2)')的動作改變了目錄內容。 –

+1

@亞當:這應該是一個答案! – duskwuff

+0

非常感謝我應該更多地閱讀關於文件系統並通過強制不讀這些文件來解決這個問題! – r3dalice

回答

1

PS:我不知道得到的READDIR手冊頁的發言:「通過READDIR返回的數據 可以通過後續調用覆蓋到READDIR 爲同一目錄流」

什麼他們基本上說的是功能不重入,並且該指針由返回不應簡單地作爲唯一值進行緩存,因爲正在指向的基礎數據將在您下次調用readdir函數時發生變化。基本上它們允許實現定義靜態分配的數據,這些數據可以被函數回收,或者由操作系統管理的動態內存,這樣調用者不必擔心管理返回值所指向的內存readdir。例如,對於一個樣本函數,如:

int* my_sample_increment() 
{ 
    static int val = 0; 
    val++; 

    return &val; 
} 

如果你對這樣做

int* int_ptr_1 = my_sample_increment(); 
int* int_ptr_2 = my_sample_increment(); 

然後,兩個int_ptr_1int_ptr_2將指向相同的值,在這種情況下,它會價值1。每個指針都不會指向唯一的整數值。

所以readdir也是如此。您不能簡單地調用readdir並存儲返回的指針,並希望在稍後的日期使用它,而不會在保存指針的時間和使用它的時間之間調用readdir時修改指向的數據。如果您需要這樣的功能,那麼這是重入版本readdir_r的用途。

+0

非常感謝我現在得到它 – r3dalice