WRITE(2) FreeBSD システムコールマニュアル WRITE(2)
名称
write, writev, pwrite − 出力の書込み |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.h> ssize_t |
write(int d, const void *buf, size_t nbytes); ssize_t |
writev(int d, const struct iovec *iov, int iovcnt); ssize_t |
pwrite(int d, const void *buf, size_t nbytes, off_t offset); |
解説 |
write() システムコールは、 buf が指すバッファから記述子 d が参照するオブ ジェクトに nbytes のデータを書き込もうとします。 writev() システムコール は同様の動作をしますが、iov[0], iov[1], ..., iov[iovcnt-1] という iov 配 列のメンバが指定する iovcnt バッファから出力データを集めます。 pwrite() システムコールは同じ機能を実行しますが、ファイルポインタを修正せずに、 ファイルの特定場所に書き込みます。 writev() では、 iovec 構造体が以下のように定義されています: struct iovec { |
void *iov_base; /* ベースアドレス */ |
||
size_t iov_len; /* 長さ */ |
}; 各 iovec エントリは、書き込むデータがあるメモリのベースアドレスと領域の長 さを指定します。 writev() システムコールは、常に領域全体を書き込んでから 次に進みます。 シーク機能があるオブジェクトでは、 write() は d に関連するポインタが指定 する位置で開始します。 lseek(2) を参照してください。 write() から戻ると、 ポインタは書き込まれたバイト数だけ進みます。 シーク機能がないオブジェクトでは、常に現在位置から書き込みます。このよう なオブジェクトに関連するポインタの値は未定義です。 実ユーザがスーパユーザでない場合、 write() は、ユーザ ID 設定ビットをファ イルでクリアします。これにより、スーパユーザが所有する書込み可能なユーザ ID 設定ファイルを ‘‘捕えた’’ ユーザは、システムセキュリティを突破できなく なります。 ソケットのように、フロー制御の影響を受けるオブジェクトで非ブロッキング I/O を使用すると、 write() と writev() は、要求したより少ないバイト数を書 き込むことがあります。戻り値に注意し、可能な場合にはオペレーションの残り を再度試してください。 |
戻り値
処理が正常に完了すると、書き込まれたバイト数が返されます。そうでない場合 は -1 が返され、エラーを示すためにグローバル変数 errno が設定されます。 |
エラー
write(), writev() および pwrite() システムコールは、以下の場合にエラーと なり、ファイルポインタは変更されずに残ります: |
[EBADF]
d 引数が、書込み用に開かれた有効な記述子ではありませ ん。 [EPIPE] [EPIPE] [EFBIG] [EFAULT] [EINVAL] [ENOSPC] [EDQUOT] [EIO] [EINTR] [EAGAIN] [EROFS] writev() は、以下のエラーを戻すことがあります: [EDESTADDRREQ] [EINVAL] [EINVAL] [EINVAL] [ENOBUFS] pwrite() システムコールは、以下のエラーを戻すことがあります: [EINVAL] [ESPIPE] 関連項目 |
規格
write() システムコールは、 ISO/IEC 9945-1:1990 (‘‘POSIX.1’’) に適合してい ます。 writev() システムコールと pwrite() システムコールは、 X/Open Portability Guide Issue 4.2 (‘‘XPG4.2’’) に適合しています。 |
歴史
pwrite() 関数は、 AT&T System V.4 UNIX で登場しました。 writev() システム コールは、 4.2BSD で登場しました。 write() 関数は、 Version 6 AT&T UNIX で登場しました。 FreeBSD 10.0 October 16, 2004 FreeBSD 10.0 |