2012-06-19 41 views
0

可以使用這樣的readdir_r嗎?我沒有找到關於它的規範什麼,但也許我只是盲目...對於readdir_r,可能條目和結果具有相同的值?

​​
+0

'男人readdir_r'。 – MYMNeo

+2

當到達目錄結尾時,'readdir_t()'將其'result'參數設置爲'NULL'。如果你用'malloc()'(可能的內存泄漏)分配'entry',請牢記這一點。否則,你可以做你所做的事情,因爲'entry'和'&entry'是按值傳遞給函數的。 –

+0

@MYMNeo:在我的系統上沒有關於它的單獨手冊頁,在'readdir'手冊中沒有提到我的問題。 – thejh

回答

3

這是readdir_ [R,第二個參數是指針一個struct的dirent,而不是一個結構dirent本身,第三個參數是一個指向結構dirent的指針,它接收struct dirent的地址或NULL作爲結束目錄。用法是一樣的東西

struct dirent* pentry = malloc(offsetof(struct dirent, d_name) + 
          pathconf(dirpath, _PC_NAME_MAX) + 1); 
if (!pentry) 
    out_of_memory(); 

for (;;){ 
    struct dirent* result; 
    readdir_r(dirp, pentry, &result); // you can check the return code, but it only fails if dirp is invalid 
    if(!result) 
     break; 
    // process result 
} 
free(pentry); 

至於斯托伊奇上面所指出的,參數是按值傳遞的,所以你可以通過第二ARG(pentry)作爲第三個參數的地址(即& pentry) - - 它不影響readir_r,它無法分辨。但是,當你到達目錄結尾時,它會在pentry中存儲NULL,但是你需要pentry的值來釋放它指向的malloced緩衝區。因此,忘記是否允許使用第二個參數的地址......這樣做是毫無意義的,誤導性的,並導致內存泄漏。

對於readdir_r的規範,請參閱系統 http://www.kernel.org/doc/man-pages/online/pages/man3/readdir.3.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions/readdir.html

+0

所以我不能使用'readdir_r()'而不使用'malloc()'來執行dirent?或者我可以只傳遞一個指向我的'dirent結構'在堆棧上的指針? –

+0

@Jawsmerc是的,你可以在棧上分配一個'struct dirent'。 d_name成員將有足夠的空間存放長度爲NAME_MAX的路徑。 –

相關問題