| 標準/拡張機能 | C/C++ | 依存項目 |
|---|---|---|
POSIX.1 |
両方 |
#define_POSIX_SOURCE
#include <unistd.h>
ssize_t read(int fs, void *buf, size_t N);
#define _XOPEN_SOURCE_EXTENDED 1
#include <unistd.h>
ssize_t read(int fs, void *buf, ssize_t N);
#define _OE_SOCKETS
#include <unistd.h>
ssize_t read(int socket, void *buf, ssize_t N);
read() 関数は、ファイル記述子 fs で表されるファイルか ら、buf で表されるメモリー域に、入力の N バイトを 読み込みます。read() が正常に実行されると、ファイルのアクセス時刻が更新さ れます。
fs が、通常ファイルまたはプロセスが検索できるその他の タイプのファイルを参照する場合には、read() により、fs と 関連したファイル・オフセットから読み取りが開始されます。正常に実行された場合、read() は、読み取ったバイト数によってファイル・ オフセットを変更します。N は、INT_MAX (limits.h ヘッダー・ファイルで定義されている) より大きくはなりません。
fs が、プロセスがシークできないファイルを参照する場合には、read() は、現在位置から読み取りを開始します。このようなファイルと関連したファイル・オフセットはありません。
ソケットの場合の動作: read() 呼び出しは、記述子 fs を用いてソケット上のデータを 読み取り、それがバッファーに保管されます。 read() 呼び出しはすべて、接続されたソケットにのみ適用されます。この呼び出しは、最大 N バイトまでのデータを戻します。使用可能なバイトが要求したバイトより少ないと、呼び出しは、現在使用可能な 数を戻します。ソケット fs のデータが使用できず、さらにソケットが ブロック・モードになっている場合は、データが到着するまで、read() 呼び出しは呼び出し元をブロックします。データが使用できず、さらにソケットがブロック解除モードになっ ている場合、read() は -1 を戻します。また、エラー・コードが EWOULDBLOCK に設定されます。非ブロッキング・モードの設定方法の説明については、ioctl() - 装置の制御または fcntl() - オープン・ファイル記述子の制御を参照してください。
データグラム・ソケットの場合には、このデータグラムの大きさが指定のバッファー に収まるならば、この呼び出しは、送信されたデータグラム全体を戻します。余分なデータグラム・データは廃棄されます。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション A および B がストリーム・ソケットと接続され、アプリケーション A が 1000 バイトを送信した場合には、この関数のそれぞれの 呼び出しは、1 バイト、または 10 バイト、あるいは 1000 バイト全体を戻すこと ができます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しをループに入れて、すべてのデータを受信するまで、この関数を呼び出す必要があります。
ストリームの動作: STREAMS ファイルからの read() は、異なる 3 つのモード (バイト・ ストリーム・モード、メッセージ廃棄以外のモード、およびメッセージ廃棄モード) で、データを読み取ることができます。 デフォルトはバイト・ストリーム・モードです。これは I_SRDOPT ioctl() 要求を使用して変更したり、I_GRDOPT ioctl() でテストすることができます。バイト・ストリーム・モードでは、要求されたバイト数と同じバイト数が転送される まで、または検索するデータがなくなるまで、read() は STREAM からデータを検索 します。バイト・ストリーム・モードでは、メッセージ境界が無視されます。
STREAMS メッセージ非廃棄モードでは、要求されたバイト数と同じバイト数が転送されるまで、またはメッセージ境界に達するまで、read() はデータを検索します。read() で検索されたのが、メッセージ中のデータのすべてではなかった場合には、残りのデータは STREAM に残され、次の read() 呼び出しで検索できます。また、メッセージ廃棄モードでも、要求されたバイト数と同じバイト数が転送されるまで、あるいはメッセージ境界に達するまで、データを検索します。ただし、read() が戻った後にメッセージ中に残っている、読み取られていないデータは廃棄され、以降の read()、readv()、または getmsg() 呼び出しでは使用できません。
read() によるゼロ・バイト STREAMS メッセージの処理方法は、設定中の現行読み取りモードによって決まります。バイト・ストリーム・モードでは、N バイトを読み取るまで、あるいはゼロ・バイトのメッセージ・ブロックが見つかるまで、read() はデータを受け入れます。この場合、read() 関数は、読み取りバイト数を戻し、ゼロ・バイト・メッセージが STREAM に入れられ、次の read()、readv()、または getmsg() によって検索されます。メッセージ廃棄以外のモードまたはメッセージ廃棄モードでは、ゼロ・バイト・ メッセージが 0 を戻し、このメッセージは STREAM から除去されます。ゼロ・バイト・メッセージが STREAM の最初のメッセージとして読み取られる 際には、読み取りモードとは関係なく、このメッセージは STREAM から除去され、0 が戻されます。
STREAM ファイルからの read() は、メッセージの優先順位のバンドにかかわらず、STREAM ヘッド読み取りキューの前のメッセージ中にデータを戻します。
デフォルトによって、STREAM は制御正常モードになっており、このモードでは、STREAM ファイルからの read() が処理できるのは、データ・パートは含むが、制御パートを含まないメッセージのみです。制御パートを含むメッセージが STREAM ヘッドに現れると、read() は 失敗します。このデフォルト・アクションは、I_SRDOPT ioctl() コマンドを使用 して、STREAM を制御データ・モードまたは制御廃棄モードのどちらかにすること によって変更できます。制御データ・モードでは、任意の制御パートがデータに変換され、同一の メッセージにもとからあるデータ・パートのいずれかを渡す前に、read() が変換します。制御廃棄モードでは、read() は、メッセージ制御パートを廃棄しますが、メッセージのすべてのデータ・パートをプロセスに戻します。
さらに、STREAM ヘッドで呼び出しの前に非同期のエラーが処理されていた場合は、read() および readv() は失敗します。この場合には、errno の値は、read() または readv() の結果を反映しませんが、前に発生したエラーは反映します。STREAM の読み取り中にハングアップが発生した場合は、read() は STREAM ヘッド読み取りキューが空になるまで、通常どおり操作を続行します。その後で、0 を戻します。
z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。
読み取り操作の開始位置が、ファイルの最後またはそれを超える場合には、read() は 0 を戻します。
read() が通常ファイルを読み取り中で、まだ書き込まれていないファイルの 一部が見つかった場合 (ただし、ファイルの終わりの前) には、read() は未書き込みバイトの代わりに、0 バイトを buf に入れます。
読み取りたい入力のバイト数が 0 の場合、read() は、その他のどんなアクションも試みずに、単に、0 を戻します。
ストリーム・ソケットでの接続が失敗したが、データは使用できる場合には、read() 関数はデータを読み取り、エラーにはなりませ ん。ストリーム・ソケットでの接続は失敗したが、データが使用できない場合には、read() 関数は、EOF として 0 バイトを戻します。
⁄* CELEBR03
This example opens a file and reads input.
*⁄
#define _POSIX_SOURCE
#include <fcntl.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>
main() {
int ret, fd;
char buf[1024];
system("ls -l ⁄ >| ls.output");
if ((fd = open("ls.output", O_RDONLY)) < 0)
perror("open() error");
else {
while ((ret = read(fd, buf, sizeof(buf)-1)) > 0) {
buf[ret] = 0x00;
printf("block read: ¥n<%s>¥n", buf);
}
close(fd);
}
unlink("ls.output");
}
block read:
<total 0
drwxr-xr-x 3 USER1 SYS1 0 Apr 16 07:59 bin
drwxr-xr-x 2 USER1 SYS1 0 Apr 6 10:20 dev
drwxr-xr-x 4 USER1 SYS1 0 Apr 16 07:59 etc
drwxr-xr-x 2 USER1 SYS1 0 Apr 6 10:15 lib
drwxrwxrwx 2 USER1 SYS1 0 Apr 16 07:55 tmp
drwxr-xr-x 2 USER1 SYS1 0 Apr 6 10:15 u
drwxr-xr-x 6 USER1 SYS1 0 Apr 6 10:15 usr
>