WRITE

Section: System Calls (2)
索引 jman

BSD mandoc
 

索引

名称

write writev pwrite - 出力の書込み  

索引

ライブラリ

Lb libc  

索引

書式

In sys/types.h In sys/uio.h In unistd.h Ft ssize_t Fn write int d const void *buf size_t nbytes Ft ssize_t Fn writev int d const struct iovec *iov int iovcnt Ft ssize_t Fn pwrite int d const void *buf size_t nbytes off_t offset  

索引

解説

Fn write システムコールは、 Fa buf が指すバッファから記述子 Fa d が参照するオブジェクトに Fa nbytes のデータを書き込もうとします。 Fn writev システムコールは同様の動作をしますが、iov[0], iov[1], ..., iov[iovcnt-1] という Fa iov 配列のメンバが指定する Fa iovcnt バッファから出力データを集めます。 Fn pwrite システムコールは同じ機能を実行しますが、ファイルポインタを修正せずに、 ファイルの特定場所に書き込みます。

Fn writev では、 Fa iovec 構造体が以下のように定義されています:

struct iovec {
        void   *iov_base;    /* ベースアドレス */
        size_t  iov_len;     /* 長さ */
};

各 Fa iovec エントリは、書き込むデータがあるメモリのベースアドレスと 領域の長さを指定します。 Fn writev システムコールは、常に領域全体を書き込んでから次に進みます。

シーク機能があるオブジェクトでは、 Fn write は Fa d に関連するポインタが指定する位置で開始します。 lseek(2) を参照してください。 Fn write から戻ると、ポインタは書き込まれたバイト数だけ進みます。

シーク機能がないオブジェクトでは、常に現在位置から書き込みます。 このようなオブジェクトに関連するポインタの値は未定義です。

実ユーザがスーパユーザでない場合、 Fn write は、ユーザ ID 設定ビットをファイルでクリアします。 これにより、スーパユーザが所有する書込み可能なユーザ ID 設定ファイルを ``捕えた'' ユーザは、システムセキュリティを突破できなくなります。

ソケットのように、フロー制御の影響を受けるオブジェクトで 非ブロッキング I/O を使用すると、 Fn write と Fn writev は、要求したより少ないバイト数を書き込むことがあります。 戻り値に注意し、可能な場合にはオペレーションの残りを再度試してください。  

索引

戻り値

処理が正常に完了すると、書き込まれたバイト数が返されます。 そうでない場合は -1 が返され、エラーを示すためにグローバル変数 errno が設定されます。  

索引

エラー

Fn write , Fn writev および Fn pwrite システムコールは、以下の場合にエラーとなり、 ファイルポインタは変更されずに残ります:

Bq Er EBADF
Fa d 引数が、書込み用に開かれた有効な記述子ではありません。
Bq Er EPIPE
プロセスによる読取り用に開かれていないパイプに書き込もうとしました。
Bq Er EPIPE
通信相手のソケットに接続していないタイプ SOCK_STREAM のソケットに書き込もうとしました。
Bq Er EFBIG
プロセスのファイルサイズ制限か最大ファイルサイズを越えたファイルに 書き込もうとしました。
Bq Er EFAULT
Fa iov の一部、またはファイルに書き込むデータは、 プロセスに割り当てられたアドレス空間の範囲外を指しています。
Bq Er EINVAL
Fa d に関連するポインタが負になっています。
Bq Er ENOSPC
ファイルを含むファイルシステムに、充分なスペースが残っていません。
Bq Er EDQUOT
ファイルを含むファイルシステムのユーザのディスクブロック割当量が 使い尽くされています。
Bq Er EIO
ファイルシステムに読み書きしている間に入出力エラーが発生しました。
Bq Er EINTR
書込みが完了する前にシグナルが割り込みました。
Bq Er EAGAIN
ファイルは非ブロッキング入出力の印がついた状態で、しかも、 すぐにデータを書き込める状態ではありません。
Bq Er EROFS
スライスの先頭にあるディスクラベル領域に書込みを行おうとしました。 ディスクラベル領域への書込みを有効にするには disklabel(8) -W を参照してください。

Fn writev は、以下のエラーを戻すことがあります:

Bq Er EDESTADDRREQ
connect(2) を使用して書込み先アドレスを設定した UNIX ドメインデータグラムソケットに書き込む場合に、書込み先が使用できません。
Bq Er EINVAL
Fa iovcnt 引数が 0 以下になっているか、 IOV_MAX より、大きくなっています。
Bq Er EINVAL
Fa iov 配列 Fa iov_len 値の 1 つが負になっています。
Bq Er EINVAL
Fa iov 配列 Fa iov_len 値の合計が、32 ビット整数をオーバフローしました。
Bq Er ENOBUFS
ソケットに書き出している時に mbuf のプールを使い尽くしました。

Fn pwrite システムコールは、以下のエラーを戻すことがあります:

Bq Er EINVAL
Fa offset の値が負です。
Bq Er ESPIPE
ファイル記述子が、パイプ、ソケット、FIFO に関連しています。

 

索引

関連項目

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

索引

規格

Fn write システムコールは、 St -p1003.1-90 に適合しています。 Fn writev システムコールと Fn pwrite システムコールは、 St -xpg4.2 に適合しています。  

索引

歴史

Fn pwrite 関数は、 AT&T System V.4 で登場しました。 Fn writev システムコールは、 BSD 4.2 で登場しました。 Fn write 関数は、 AT&T System v6 で登場しました。


 

索引

Index

名称
ライブラリ
書式
解説
戻り値
エラー
関連項目
規格
歴史

jman



Time: 07:06:32 GMT, January 12, 2009