.\" Copyright (C) 1993 David Metcalfe (david@prism.demon.co.uk) .\" and Copyright (C) 2008, 2016 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" References consulted: .\" Linux libc source code .\" Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991) .\" 386BSD man pages .\" Modified Sat Jul 24 16:09:49 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 11 June 1995 by Andries Brouwer (aeb@cwi.nl) .\" Modified 22 July 1996 by Andries Brouwer (aeb@cwi.nl) .\" 2007-07-30 Ulrich Drepper , mtk: .\" Rework discussion of nonstandard structure fields. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 1997 HIROFUMI Nishizuka .\" all rights reserved. .\" Translated 1997-12-24, HIROFUMI Nishizuka .\" Updated & Modified 2002-03-24, Yuichi SATO .\" Updated & Modified 2005-01-16, Yuichi SATO .\" Updated & Modified 2005-09-06, Akihiro MOTOKI .\" Updated 2008-08-11, Akihiro MOTOKI , LDP v3.05 .\" Updated 2013-03-26, Akihiro MOTOKI .\" Updated 2013-05-01, Akihiro MOTOKI .\" Updated 2013-07-22, Akihiro MOTOKI .\" .TH READDIR 3 2019\-03\-06 "" "Linux Programmer's Manual" .SH 名前 readdir \- ディレクトリを読み込む .SH 書式 .nf \fB#include \fP .PP \fBstruct dirent *readdir(DIR *\fP\fIdirp\fP\fB);\fP .fi .SH 説明 \fBreaddir\fP() 関数は、\fIdirp\fP が指すディレクトリストリームの中で、 次のディレクトリエントリーを表す \fIdirent\fP 構造体へのポインターを返す。 ディレクトリストリームの末尾に達した場合や、 エラーが発生した場合は、 NULL を返す。 .PP glibc の実装では \fIdirent\fP 構造体は以下のように定義されている。 .PP .in +4n .EX struct dirent { ino_t d_ino; /* inode 番号 */ off_t d_off; /* オフセットではない; 下記を参照 */ unsigned short d_reclen; /* このレコードの長さ */ unsigned char d_type; /* ファイル種別。全ファイルシステム */ でサポートされているわけではない */ char d_name[256]; /* ヌル終端されたファイル名 */ }; .EE .in .PP \fIdirent\fP 構造体のフィールドのうち POSIX.1 で要求されているのは、 \fId_name\fP と \fId_ino\fP だけである。他のフィールドは非標準であり、すべてのシステムで存在するわけではない。 詳細については、下記の「注意」を参照のこと。 .PP \fIdirent\fP 構造体のフィールドは以下の通りである: .TP \fId_ino\fP ファイルの inode 番号である。 .TP \fId_off\fP .\" https://lwn.net/Articles/544298/ \fId_off\fP で返される値は、ディレクトリストリームの現在の位置で \fBtelldir\fP(3) を呼び出した場合の返り値と同じである。フィールドの型や名前はこうなっているが、最近のファイルシステムでは \fId_off\fP フィールドが何らかのディレクトリオフセットであることはめったにない。アプリケーションプログラムでは、必ずこの値を内容を意識せず単なる値として扱うべきであり、その内容について前提を持つべきではない。 \fBtelldir\fP(3) も参照。 .TP \fId_reclen\fP 返されたレコードの (バイト単位の) サイズである。この値は上記の構造体の定義のサイズとは一致しないかもしれない。「注意」を参照。 .TP \fId_type\fP ファイル種別を示す値が格納される。これにより、これ以降の処理がファイル種別に依存している場合に \fBlstat\fP(2) を呼び出すコストを避けることができる。 .IP 適切な機能検査マクロ (glibc 2.19 以降では \fB_DEFAULT_SOURCE\fP、 glibc 2.19 以前では \fB_BSD_SOURCE\fP) が定義されている場合、 glibc は \fId_type\fP の値に対応する以下のマクロ定数を定義する。 .RS .TP 12 \fBDT_BLK\fP ブロックデバイスである。 .TP \fBDT_CHR\fP キャラクターデバイスである。 .TP \fBDT_DIR\fP ディレクトリである。 .TP \fBDT_FIFO\fP 名前付きパイプ (FIFO) である。 .TP \fBDT_LNK\fP シンボリックリンクである。 .TP \fBDT_REG\fP 通常のファイルである。 .TP \fBDT_SOCK\fP UNIX ドメインソケットである。 .TP \fBDT_UNKNOWN\fP ファイル種別が判別できなかった。 .RE .IP .\" kernel 2.6.27 .\" The same sentence is in getdents.2 現在のところ、 \fId_type\fP でファイルタイプを返す機能が完全にサポートされているのは、 いくつかのファイルシステムにおいてのみである (Btrfs, ext2, ext3, ext4 はサポートしている)。 どのアプリケーションも \fBDT_UNKNOWN\fP が返された際に適切に処理できなければならない。 .TP \fId_name\fP このフィールドはヌル終端されたファイル名である。「注意」を参照。 .PP \fBreaddir\fP() によって返されるデータは、それ以降の同じストリームに対する \fBreaddir\fP() の呼び出しによって上書きされる可能性がある。 .SH 返り値 成功すると、 \fBreaddir\fP() は \fIdirent\fP 構造体へのポインターを返す。 (この構造体は静的に割り当てられているかもしれない。 このポインターを \fBfree\fP(3) しようとしないこと。) .PP ディレクトリストリームの末尾に達した場合には、NULL が返され、 \fIerrno\fP は変化しない。 エラーが発生した場合、NULL が返され、 \fIerrno\fP が適切に設定される。エラーからストリームの末尾を区別するには、 \fBreaddir\fP() を呼び出す前に \fIerrno\fP を 0 に設定しておき、 NULL が返された場合に \fIerrno\fP の値を確認すればよい。 .SH エラー .TP \fBEBADF\fP ディレクトリストリームディスクリプター \fIdirp\fP が無効である。 .SH 属性 この節で使用されている用語の説明については、 \fBattributes\fP(7) を参照。 .TS allbox; lb lb lb l l l. インターフェース 属性 値 T{ \fBreaddir\fP() T} Thread safety MT\-Unsafe race:dirstream .TE .sp 1 .PP .\" FIXME . .\" http://www.austingroupbugs.net/view.php?id=696 現在の POSIX.1 標準 (POSIX.1\-2008) では、 \fBreaddir\fP() がスレッドセーフであることは求められていない。しかしながら、最近の実装 (glibc による実装も含む) では、異なるディレクトリストリームに対する \fBreaddir\fP() の同時並行の呼び出しはスレッドセーフである。複数のスレッドが同じディレクトリストリームから読み込みを行う必要がある場合も、非推奨の \fBreaddir_r\fP(3) 関数を使用するよりも、外部同期を用いた \fBreaddir\fP() を使う方が推奨される。 POSIX.1 の将来のバージョンでは、 \fBreaddir\fP() は異なるディレクトリストリームに対して同時に使用された際にスレッドセーフであることが必須となる予定である。 .SH 準拠 POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.3BSD. .SH 注意 ディレクトリストリームは \fBopendir\fP(3) を使ってオープンする。 .PP 連続する \fBreaddir\fP() の呼び出しで読み込まれるファイル名の順序は、ファイルシステムの実装に依存する。名前が何らかの方法でソートされていることはありえない。 .PP .\" POSIX.1-2001, POSIX.1-2008 .\" フィールド \fId_name\fP と (XSI 拡張の) \fId_ino\fP だけが POSIX.1 で規定されている。 \fId_type\fP フィールドは、 Linux 以外では、おもに BSD 系のシステムでのみ利用可能である。残りのフィールドは多くのシステムに存在するが、全てのシステムに存在するわけではない。 glibc では、プログラムが POSIX.1 で定義されていないフィールドが 利用できるかをチェックすることができる。 チェックするには、マクロ \fB_DIRENT_HAVE_D_NAMLEN\fP, \fB_DIRENT_HAVE_D_RECLEN\fP, \fB_DIRENT_HAVE_D_OFF\fP, \fB_DIRENT_HAVE_D_TYPE\fP が定義されているかをテストすればよい。 .SS "d_name フィールド" 上記の \fIdirent\fP 構造体の定義は glibc のヘッダーからの引用であり、 \fId_name\fP フィールドは固定サイズとなっている。 .PP \fI警告\fP: アプリケーションは、 \fId_name\fP フィールドのサイズに依存すべきではない。 POSIX ではこのフィールドは \fIchar\ d_name[]\fP (サイズ不定の文字配列) として規定しており、最大で終端のヌルバイト (\(aq\e0\(aq) の前に \fBNAME_MAX\fP 文字が入る。 .PP POSIX.1 は、このフィールドを左辺値として使用すべきではないと明記している。また、 POSIX.1 では、 \fIsizeof(d_name)\fP の使用は間違いであり、代わりに \fIstrlen(d_name)\fP を使用するように、との注記もある (いくつかのシステムでは、このフィールドは \fIchar\ d_name[1]\fP! として定義されている)。このことは、 \fId_name\fP を含むレコードのサイズを取得するために \fIsizeof(struct dirent)\fP を使用することも間違いであることを暗に示している。 .PP 多くのファイルシステムでは、 .PP fpathconf(fd, _PC_NAME_MAX) .PP の呼び出しは値 255 を返すが、いくつかのファイルシステム (例えば CIFS や Windows SMB サーバーなど) では、(正しい動作なのだが) \fId_name\fP で返されるヌル終端されたファイル名は実際にはこのサイズを超える場合がある点に注意すること。このような場合、 \fId_reclen\fP フィールドは、上記の glibc \fIdirent\fP 構造体のサイズよりも大きな値となる。 .SH 関連項目 \fBgetdents\fP(2), \fBread\fP(2), \fBclosedir\fP(3), \fBdirfd\fP(3), \fBftw\fP(3), \fBoffsetof\fP(3), \fBopendir\fP(3), \fBreaddir_r\fP(3), \fBrewinddir\fP(3), \fBscandir\fP(3), \fBseekdir\fP(3), \fBtelldir\fP(3) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は \%https://www.kernel.org/doc/man\-pages/ に書かれている。