1、opendir與readdir函數
(1)、opendir打開一個目錄后得到一個DIR類型的的指針給readdir使用。
(2)、readdir函數調用一次后就會返回一個struct dirent類型的指針,這個指針指向一個結構體變量,這個結構體變量里面記錄了一個目錄項(所謂目錄項就是目錄中的一個子文件)。
(3)、readdir調用一次只能讀出一個目錄項,要想讀出目錄中的所有目錄項必須多次調用readdir函數。readdir函數內部會記住哪個目錄項已經被讀過了哪個還沒讀,所以多次調用后不會重復返回已經返回過的目錄項。當readdir函數返回NULL時就代表目錄中的所有目錄項已經讀完了。
2、可重入函數介紹
(1)、有些函數是可重入的有些是不可重入的。可重入函數可以理解為是能被中斷的函數,並且它被中斷返回后也不會出現什么錯誤。不可重入函數可以理解為如果函數被中斷的話,就會出現不可預料的錯誤。這是因為函數中使用了一些系統資源,比如全局變量區,中斷向量表之類的。比如多個進程同時對一個文件進行寫操作,如果沒有同步機制的話,對文件的寫入就會變得難以控制。
(2)、readdir函數和我們之前接觸的一些函數是不同的,首先readdir函數直接返回了一個結構體變量指針,因為readdir內部申請了內存並且給我們返回了地址。多次調用readdir時,其實readdir內部並不會重復申請內存而是使用第一次調用readdir時分配的那個內存。這種設計方法是readdir不可重入的關鍵。
(3)、readdir在多次調用時是有關聯的,這個關聯也表明readdir函數是不可重入的。
(4)、庫函數中有一些函數當年剛開始提供的時候都是不可重入的,后來意識到這種方式不安全,所以重新封裝了C庫,提供了對應的可重復版本(一般是不可重入版本函數名+ _r )。