OSDN Git Service

Import LDP_man-pages from https://scm.osdn.net/gitroot/linuxjm/LDP_man-pages.git
[linuxjm/jm.git] / manual / LDP_man-pages / release / man2 / getdents.2
diff --git a/manual/LDP_man-pages/release/man2/getdents.2 b/manual/LDP_man-pages/release/man2/getdents.2
new file mode 100644 (file)
index 0000000..36eddce
--- /dev/null
@@ -0,0 +1,250 @@
+.\" Copyright (C) 1995 Andries Brouwer (aeb@cwi.nl)
+.\"
+.\" %%%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
+.\"
+.\" Written 11 June 1995 by Andries Brouwer <aeb@cwi.nl>
+.\" Modified 22 July 1995 by Michael Chastain <mec@duracef.shout.net>:
+.\"   Derived from 'readdir.2'.
+.\" Modified Tue Oct 22 08:11:14 EDT 1996 by Eric S. Raymond <esr@thyrsus.com>
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.\"
+.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya
+.\"         all rights reserved.
+.\" Translated Sat Feb 22 20:15:56 JST 1997
+.\"         by HANATAKA Shinya <hanataka@abyss.rim.or.jp>
+.\" Updated Sun Oct 12 JST 2003 by Kentaro Shirakata <argrath@ub32.org>
+.\" Updated Wed Jul 30 JST 2008 by Kentaro Shirakata <argrath@ub32.org>
+.\" Updated 2009-02-12 by Kentaro Shirakata <argrath@ub32.org>
+.\" Updated 2012-04-30, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-03-26, Akihiro MOTOKI <amotoki@gmail.com>
+.\"
+.TH GETDENTS 2 2012\-08\-03 Linux "Linux Programmer's Manual"
+.SH 名前
+getdents \- ディレクトリエントリーを取得する
+.SH 書式
+.nf
+\fBint getdents(unsigned int \fP\fIfd\fP\fB, struct linux_dirent *\fP\fIdirp\fP\fB,\fP
+\fB             unsigned int \fP\fIcount\fP\fB);\fP
+.fi
+
+\fI注\fP: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。
+.SH 説明
+これはあなたの関心を引くような関数ではない。 POSIX 準拠の C ライブラリインターフェースについては \fBreaddir\fP(3)  を見ること。
+このページは、カーネルシステムコールの生のインターフェースについて 記載したものである。
+.PP
+\fBgetdents\fP()  システムコールは、オープン済みのファイルディスクリプター \fIfd\fP で参照されるディレクトリから
+\fIlinux_dirent\fP 構造体をいくつか読み出し、 \fIdirp\fP が指しているバッファーに格納する。 \fIcount\fP
+引き数はそのバッファーのサイズを示す。
+.PP
+\fIlinux_dirent\fP 構造体は以下のように宣言されている:
+.PP
+.in +4n
+.nf
+struct linux_dirent {
+    unsigned long  d_ino;     /* Inode number */
+    unsigned long  d_off;     /* Offset to next \fIlinux_dirent\fP */
+    unsigned short d_reclen;  /* Length of this \fIlinux_dirent\fP */
+    char           d_name[];  /* Filename (null\-terminated) */
+                      /* length is actually (d_reclen \- 2 \-
+                         offsetof(struct linux_dirent, d_name)) */
+    /*
+    char           pad;       // Zero padding byte
+    char           d_type;    // File type (only since Linux
+                              // 2.6.4); offset is (d_reclen \- 1)
+    */
+
+}
+.fi
+.in
+.PP
+\fId_ino\fP は inode 番号である。 \fId_off\fP はディレクトリの先頭から次の \fIlinux_dirent\fP の先頭までの距離である。
+\fId_reclen\fP はこの \fIlinux_dirent\fP 全体のサイズである。 \fId_name\fP はヌル文字で終わるファイル名である。
+
+\fId_type\fP は、構造体の最後のバイトであり、ファイルタイプを示す。 \fId_type\fP は以下の値の一つを取る
+(\fI<dirent.h>\fP で定義されている)。
+.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
+ファイルタイプが不明である。
+.PP
+\fId_type\fP フィールドは Linux 2.6.4 から実装されている。 これは \fIlinux_dirent\fP
+構造体のうち、以前はゼロで埋められていた空間に配置されている。 従って、2.6.3 以前のカーネルでは、このフィールドにアクセスしようとすると 常に値
+0 (\fBDT_UNKNOWN\fP)  が返される。
+.PP
+.\" kernel 2.6.27
+.\" The same sentence is in readdir.2
+現在のところ、 \fId_type\fP でファイルタイプを返す機能が完全にサポートされているのは、 いくつかのファイルシステムにおいてのみである
+(Btrfs, ext2, ext3, ext4 はサポートしている)。 どのアプリケーションも、 \fBDT_UNKNOWN\fP
+が返された際に適切に処理できなければならない。
+.SH 返り値
+成功した場合は、読み込んだバイト数が返される。 ディレクトリの終わりならば 0 が返される。 エラーの場合は \-1 を返され、 \fIerrno\fP
+に適切な値が設定される。
+.SH エラー
+.TP 
+\fBEBADF\fP
+ファイルディスクリプター \fIfd\fP が不正である。
+.TP 
+\fBEFAULT\fP
+引き数が呼び出したプロセスのアドレス空間外を指している。
+.TP 
+\fBEINVAL\fP
+結果用のバッファーが小さすぎる。
+.TP 
+\fBENOENT\fP
+そのようなディレクトリは存在しない。
+.TP 
+\fBENOTDIR\fP
+ファイルディスクリプターがディレクトリを参照していない。
+.SH 準拠
+.\" SVr4 documents additional ENOLINK, EIO error conditions.
+SVr4.
+.SH 注意
+glibc はこのシステムコールに対するラッパー関数を提供していないので、 \fBsyscall\fP(2)  を使って呼び出すこと。
+\fIlinux_dirent\fP 構造体は自分で定義する必要がある。しかし、たいていはこのシステムコールではなく \fBreaddir\fP(3)
+を使うべき場面のことが多い。
+
+このシステムコールは \fBreaddir\fP(2)  を置き換えるものである。
+
+元々の Linux の \fBgetdents\fP() システムコールは、大きなファイルシステムと
+大きなファイルオフセットを扱うことができなかった。
+その結果、Linux 2.4 で \fBgetdents64\fP() が追加された。
+\fBgetdents64\fP() では、\fIlinux_dirent\fP 構造体のフィールド \fId_ino\fP と
+\fId_off\fP でビット幅の大きなデータ型が使われている。
+.SH 例
+.\" FIXME The example program needs to be revised, since it uses the older
+.\" getdents() system call and the structure with smaller field widths.
+下記のプログラムは \fBgetdents\fP()  の使用例を示したものである。 以下は、このプログラムを ext2 ディレクトリで実行した際に得られる
+出力の例である。
+
+.in +4n
+.nf
+$\fB ./a.out /testfs/\fP
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=120 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+inode#    file type  d_reclen  d_off   d_name
+       2  directory    16         12  .
+       2  directory    16         24  ..
+      11  directory    24         44  lost+found
+      12  regular      16         56  a
+  228929  directory    16         68  sub
+   16353  directory    16         80  sub2
+  130817  directory    16       4096  sub3
+.fi
+.in
+.SS プログラムのソース
+\&
+.nf
+#define _GNU_SOURCE
+#include <dirent.h>     /* Defines DT_* constants */
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/syscall.h>
+
+#define handle_error(msg) \e
+        do { perror(msg); exit(EXIT_FAILURE); } while (0)
+
+struct linux_dirent {
+    long           d_ino;
+    off_t          d_off;
+    unsigned short d_reclen;
+    char           d_name[];
+};
+
+#define BUF_SIZE 1024
+
+int
+main(int argc, char *argv[])
+{
+    int fd, nread;
+    char buf[BUF_SIZE];
+    struct linux_dirent *d;
+    int bpos;
+    char d_type;
+
+    fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY);
+    if (fd == \-1)
+        handle_error("open");
+
+    for ( ; ; ) {
+        nread = syscall(SYS_getdents, fd, buf, BUF_SIZE);
+        if (nread == \-1)
+            handle_error("getdents");
+
+        if (nread == 0)
+            break;
+
+        printf("\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=%d \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\en", nread);
+        printf("inode#    file type  d_reclen  d_off   d_name\en");
+        for (bpos = 0; bpos < nread;) {
+            d = (struct linux_dirent *) (buf + bpos);
+            printf("%8ld  ", d\->d_ino);
+            d_type = *(buf + bpos + d\->d_reclen \- 1);
+            printf("%\-10s ", (d_type == DT_REG) ?  "regular" :
+                             (d_type == DT_DIR) ?  "directory" :
+                             (d_type == DT_FIFO) ? "FIFO" :
+                             (d_type == DT_SOCK) ? "socket" :
+                             (d_type == DT_LNK) ?  "symlink" :
+                             (d_type == DT_BLK) ?  "block dev" :
+                             (d_type == DT_CHR) ?  "char dev" : "???");
+            printf("%4d %10lld  %s\en", d\->d_reclen,
+                    (long long) d\->d_off, d\->d_name);
+            bpos += d\->d_reclen;
+        }
+    }
+
+    exit(EXIT_SUCCESS);
+}
+.fi
+.SH 関連項目
+\fBreaddir\fP(2), \fBreaddir\fP(3)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。