コンテクスト:
このreaddir_r関数は、から次のエントリを読み取るために使用されますDIR*(もありreaddirますが、スレッドセーフではありません)。readdir_r出力を保持するためにユーザーが割り当てたバッファーへのポインターを取りますdirent。マンページは、このバッファに必要なサイズがシステムごとに異なる可能性があることを示しており、実行時に安全な長さを見つける方法の例を示しています。
len = offsetof(struct dirent, d_name) + pathconf(dirpath, _PC_NAME_MAX) + 1;
(警告:上記には競合状態があります。これは、を使用dirfdして開いたファイル記述子を取得し、の代わりにをDIR*使用することで回避できます)fpathconfpathconf
質問:
のマンページを見るとpathconf、次のように記載されています。
_PC_NAME_MAX は、プロセスが作成できるディレクトリパスまたはfd内のファイル名の最大長を返します。対応するマクロは_POSIX_NAME_MAXです。
ただし、メモのセクションには次のように記載されています。
nameが_PC_NAME_MAXに等しい場合に返される値よりも長い名前のファイルが、指定されたディレクトリに存在する可能性があります。
このメモは本当ですか?もしそうなら、readdir_rmanページのサンプルコードは正しくありませんか?