READ(2) — NEWS-OS Programmer’s Manual
名称
read, readv − 入力を読み取る
形式
cc = read(d, buf, nbytes)
int cc, d;
char ∗buf;
int nbytes;
#include <sys/types.h>
#include <sys/uio.h>
cc = readv(d, iov, iovcnt)
int cc, d;
struct iovec ∗iov;
int iovcnt;
解説
read は、 ディスクリプタ d で指されたオブジェクトから、 nbytes のデータを buf によって指し示されたバッファへ読み込みます。 readv も同様の働きを しますが、 入力データは、 array: iov[0], iov[1], ..., iov[iovcnt−1] のメンバによって指定された iovcnt 個のバッファへ分散されます。
readv では、 iovec 構造体は次のように定義されています。
struct iovec {
caddr_tiov_base;
intiov_len;
};
各 iovec エントリは、 データが置かれるメモリ内のベースアドレスと領域の長さを 指定します。 readv は常に、 次へ進む前に 1 つの領域を 完全に満たします。
シーキングのできるオブジェクトに対しては、 read は、 d に関するポインタによって与えられた位置から開始します ( lseek(2) 参照)。 read からのリターンがあると、 このポインタは、 実際に読み取られたバイトの数だけインクリメントされます。
シーキングのできないオブジェクトでは、 常に現在の位置から開始します。 そのようなオブジェクトに関するポインタの値は、 不定です。
正常に終了すると、 read と readv は、 実際に読み取られ、 バッファに収められたバイトの数を 返します。 ディスクリプタが end-of-file の前に多くのバイトが残されている通常のファイルを 指している場合に限り、 システムは、 要求されたバイト数の読み取りを 保証します。
返された値が 0 である場合は、 end-of-file に到達してしまったことを 示します。
リターン値
コールが成功すると、 実際に読み取られたバイトの数が返されます。 そうでない場合には、 −1 が返され、 グローバル変数 errno がエラーを 示すようにセットされます。
エラー
次の項目のうち、1 つ以上が真である場合には、 read と readv は失敗します。
[EBADF] d が読み取りのためにオープンされている有効なファイル またはソケットではない。
[EFAULT] buf が、 割り当てられているアドレススペースの外を 指している。
[EIO] ファイルシステムから読み取りを 行っている間に、 入出力エラーが発生した。
[EINTR] 速度の遅いデバイスからの読み取りが、 データが到着する前にシグナルによって割り込まれた。
[EINVAL] d に関するポインタが負である。
[EWOULDBLOCK]
ファイルがブロッキングでない入出力のためにマークされていて、 かつ、 読み取れる状態のデータがなかった。
上記のエラーのほかに、 readv は次のエラーの 1 つを 返すことがあります。
[EINVAL] iovcnt が、 0 に等しいかそれより小さかった、 または 16 より大きかった。
[EINVAL] 配列 iov 内の iov_len 値の 1 つが負であった。
[EINVAL] 配列 iov 内の iov_len 値の合計が、 32 ビットの整数を オーバーフローした。
[EFAULT] iov の一部が、 そのプロセスの割り当てアドレススペースの外を 指している。
関連事項
dup(2), fcntl(2), open(2), pipe(2), select(2), socket(2), socketpair(2)
NEWS-OSRelease 4.2.1R