2012-09-20 43 views
3

語境:pathconf(...,_PC_NAME_MAX)提供了什麼保證?

readdir_r功能是用來讀取從DIR*下一個條目(有也是readdir,但是這不是線程安全的)。 readdir_r需要一個指向用戶分配緩衝區的指針來保存輸出dirent。手冊頁表示此緩衝器所需的尺寸可以是不同的系統上不同的,並且提供瞭如何找到在運行時安全的長度的例子:

len = offsetof(struct dirent, d_name) + pathconf(dirpath, _PC_NAME_MAX) + 1; 

(警告:有一個爭用條件在上文中,

縱觀聯機幫助頁:可以通過使用dirfd以獲取打開DIR*文件描述符和使用pathconffpathconf代替)

問題被避免3210,它指出:

_PC_NAME_MAX 返回一個文件名的最大長度在該目錄路徑或fd該進程被允許創建。相應的宏是_POSIX_NAME_MAX。

然而,在註釋部分,它指出:

與名稱長度長於值返回名稱等於_PC_NAME_MAX指定目錄可能存在

文件。

這個說明是正確的嗎?如果是這樣,readdir_r手冊頁中的示例代碼不正確?

回答

2

{NAME_MAX}的解釋與POSIX不一致。 POSIX表示,實現必須將名稱長於{NAME_MAX}的名稱視爲錯誤,並且{NAME_MAX} +1字節的緩衝區已足夠。

另一種方法(POSIX.1-2008)是使用線程安全的scandir(),它從調用者中抽象出這個問題。不幸的是,在任何版本的POSIX中都沒有scandirat()fscandir()

在許多系統中,也可以放心使用readdir()只要能返回struct dirent上次訪問之前發生到readdir()下一次調用(從結構的有效性的現有要求同系列)。我認爲POSIX沒有理由不允許這樣做。 readdir_r()需要相當多的額外代碼,這會讓事情變得更慢更復雜。

相關問題