Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ write(2) — NEWS-os 3.3

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fcntl(2)

lseek(2)

open(2)

pipe(2)

select(2)

WRITE(2)  —  UNIX Programmer’s Manual

名称

write, writev − 出力を書き込む

形式

cc = write(d, buf, nbytes)
int cc, d;
char ∗buf;
int nbytes;

#include <sys/types.h>
#include <sys/uio.h>

cc = writev(d, iov, iovcnt)
int cc, d;
struct iovec ∗iov;
int iovcnt;

解説

write は、 buf によって指し示されたバッファから、 ディスクリプタ d で指されたオブジェクトへ nbytes のデータを 書き込みます。 writev も、 同様の処理を 実行しますが、 配列 iov (iov[0], iov[1], ..., iov[iovcnt−1]) のメンバによって指定された iovcnt 個のバッファから出力データを 集めます。

writev では、 iovec 構造体は、 次のように定義されています。

struct iovec {
caddr_tiov_base;
intiov_len;
};

各 iovec エントリは、 書き込まれるデータが格納されているメモリ内の 1つの領域の ベースアドレスと長さを指定します。 writev は、 次へ進む前に、 常に 1つの完全な領域を 書き出します。

シーキング可能なオブジェクトに対しては、 write は、 d に関するポインタによって与えられた位置から開始します (lseek(2) 参照)。 write からのリターンがあると、 このポインタは、 実際に書き込まれたバイトの数だけインクリメントされます。

シーキングのできないオブジェクトでは、 常に現在の位置から書き込みます。 そのようなオブジェクトに関するポインタの値は 不定です。

実ユーザがスーパーユーザではない場合には、 write は、 ファイルのセットユーザIDを クリアします。 これは、 スーパーユーザによって所有されている書き込み可能な セットユーザIDのファイルを “略奪”し ようとする ユーザによるシステムへの侵入を防止します。

フロー制御を 前提としたソケットのようなオブジェクトに対して非ブロッキング入出力を 使用する場合には、 write と writev は、 要求よりも少ないバイト数を 書き込むことがあります。 このような場合には、 リターン値に注意しなければならず、 オペレーションの残りの部分は、 可能なときに再試行する必要があります。

リターン値

正常に終了した場合には、 実際に書き込まれたバイトの数が返されます。 そうでない場合には、 −1 が返され、 グローバル変数 errno がエラーを 示すようにセットされます。

エラー

以下に示されている項目のうち、1つ以上が真である場合には、 write と writev は失敗し、 ファイルポインタは変更されません。

[EBADF] d が書き込みのためにオープンされている有効なディスクリプタではない。

[EPIPE] プロセスによる読み取りのためにオープンされていないパイプに対して書き込みを 行おうとした。

[EPIPE] peer ソケットへコネクトされていない SOCK_STREAM タイプのソケットに 対して書き込みを行おうとした。

[EFBIG] そのプロセスのファイルサイズの制限または最大ファイルサイズを オーバーしているファイルへ書き込みを 行おうとした。

[EFAULT] iov の一部またはファイルへ書き込まれるデータの一部が、 そのプロセスの割当てアドレススペースの外を 指している。

[EINVAL] d に関するポインタが負である。

[ENOSPC] ファイルが収められているファイルシステムに、 フリースペースが残されていない。

[EDQUOT] ファイルが収められているファイルシステムで、 そのユーザのディスクブロックの割り当て量が使い果たされている。

[EIO] ファイルシステムからの読み取りまたはファイルシステムへの書き込みを 行っている間に、 入出力エラーが発生した。

[EWOULDBLOCK]
ファイルが非ブロッキング入出力のためにマークされていて、 かつ、 データがすぐに書き込める状態ではなかった。

上記のほかに、 writev は次のエラーの 1つを 返すことがあります。

[EINVAL] iovcnt が、 0 に等しいかそれより小さかった、 または 16 より大きかった。

[EINVAL] 配列 iov 内の iov_len 値の 1つが負であった。

[EINVAL] 配列 iov 内の iov_len 値の合計が、 32 ビットの整数を オーバーフローした。

関連事項

fcntl(2), lseek(2), open(2), pipe(2), select(2)

NEWS-OSRelease 3.3

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026