pwrite(2) FreeBSD 一般コマンドマニュアル

pwrite

前のページ 上に戻る 次のページ

pwrite




書式

     #include <sys/types.h>
     #include <sys/uio.h>
     #include <unistd.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 {
                   char   *iov_base;    /* ベースアドレス */
                   size_t  iov_len;     /* 長さ */
           };

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

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

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

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

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


実装上の注意事項

     非スレッドライブラリでは、 write() は write システムコールのように実装さ
     れます。
     が実行されます。 writev() は戻る前に d のロックを解除します。


戻り値

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


エラー

     write(), writev(), pwrite() は、以下の場合にエラーとなり、ファイルポイン
     タは変更されずに残ります。

     [EBADF]            d が、書込み用に開かれた有効な記述子ではありません。

     [EPIPE]            プロセスによる読取り用に開かれていないパイプに書込もう
                        としました。

     [EPIPE]            通信相手のソケットに接続していないタイプ SOCK_STREAM
                        のソケットに書込もうとしました。

     [EFBIG]            プロセスのファイルサイズ制限か最大ファイルサイズを越え
                        たファイルに書込もうとしました。

     [EFAULT]           iov の一部、またはファイルに書込むデータは、プロセスに
                        割り当てられたアドレス空間の範囲外を指しています。

     [EINVAL]           d に関連するポインタが負になっています。

     [ENOSPC]           ファイルを含むファイルシステムに、充分なスペースが残っ
                        ていません。

     [EDQUOT]           ファイルを含むファイルシステムのユーザのディスクブロッ
                        ク割当量が使い尽くされています。

     [EIO]              ファイルシステムに読み書きしている間に入出力エラーが発
                        生しました。

     [EINTR]            書込みが完了する前にシグナルが割り込みました。

     [EAGAIN]           ファイルは非ブロッキング入出力の印がついた状態で、しか
                        も、すぐにデータを書込める状態ではありません。

     writev() は、以下のエラーを戻すことがあります。

     [EDESTADDRREQ]     connect(2) を使用して書込み先アドレスを設定した UNIX
                        ドメインデータグラムソケットに書込む場合に、書込み先が
                        使用できません。

     [EINVAL]           iovcnt が 0 以下になっているか、 UIO_MAXIOV より、大き
                        くなっています。

     [EINVAL]           iov 配列 iov_len 値の 1 つが負になっています。

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


規格

     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 4.4                      April 2, 1994                     FreeBSD 4.4

ABELNET VPSサービス