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
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 戻り値
-
- エラー
-
- 関連項目
-
- 規格
-
- 歴史
-
Time: 07:06:32 GMT, January 12, 2009