write() - ファイルまたはソケットへのデータの書き込み

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <unistd.h>

ssize_t write(int fs, const void *buf, size_t N);
X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <unistd.h>

ssize_t write(int fs, const void *buf, ssize_t N);
バークレー・ソケット:
#define _OE_SOCKETS
#include <unistd.h>

ssize_t write(int fs, const void *buf, ssize_t N);

機能説明

buf から N バイトを、fs と関連したファイルまたはソケットに書き込みます。N は、INT_MAX (limits.h ヘッダー・ファイルで定義されている) より大きくはなりません。N がゼロの場合には、write() は、他のアクションを試みないで単に 0 を戻します。

fs が、通常ファイルまたはプロセスがシークできるその他の 型のファイルを参照する場合には、write() が、fs と 関連したファイル・オフセットから書き込みを開始します。正常に実行された場合、write() は、書き込まれたバイト数 だけファイル・オフセットを増やします。増分したファイル・オフセットがファイルの直前の長さより大きい 場合には、そのファイルの長さは新規のファイル・オフセットに 設定されます。

fs が、プロセスがシークできないファイルを参照する場合には、write() は、現在位置から書き込みを開始します。このようなファイルと関連したファイル・オフセットはありません。

(fcntl.h ヘッダー・ファイルに定義されている) O_APPEND が そのファイルに設定された場合には、write() は出力を書き込む 前にそのファイル・オフセットをファイルの終わりに設定します。

要求されたバイト数を書き込むのに十分なスペースがない場合 (例えば、ディスク上に十分にスペースがない場合) には、write() は 残りのスペースが保留できる最大のバイトを出力します。

write() にシグナルが割り込むと、結果は次のいずれかになります。
  • write() がまだデータを書き込んでいない場合には、-1 を戻し、errno を EINTR に設定します。
  • write() が正常に一部のデータを書き込んだ場合には、割り込まれる前に書き込んだバイト数を戻します。
パイプまたは FIFO 特殊ファイルでの書き込み操作は、正規のファイル での書き込み操作と同じ方法で処理されますが、次は例外です。
  • パイプには関連したファイル・オフセットがないので、すべての書き込みはパイプの終わりに追加されます。
  • N が PIPE_BUF より小さいか等しい場合には、出力は同じパイプに書き込み中の他のプロセスによって書き込まれた データとインターリーブしません。N が PIPE_BUF バイトより大きい場合には、出力は (fcntl.h ヘッダー・ファイルに定義されている、O_NONBLOCK の設定値と関係なく) 他のデータとインターリーブ できます。パイプに対する書き込みは、データを転送した場合には errno を EINTR に設定しても戻りません。
  • (fcntl.h ヘッダー・ファイルに定義されている) O_NONBLOCK が 設定されていない場合には、write() は正規に完了するまでプロセス の実行をブロックすることがあります。
  • O_NONBLOCK が設定されると、write() は、プロセスの実行をブロックしません。N が PIPE_BUF より小さいか等しい場合には、write() は完全に成功し、N の値を戻すか、または何も書き込まないで、errno を EAGAIN に設定してから、-1 を戻します。N が PIPE_BUF より大きい場合には、write() は、できるだけ多くのバイトを書き込み、この数をその結果として戻すか、または何も書き込まないで、errno を EAGAIN に設定してから、-1 を戻します。
非ブロック書き込みをサポートし、データを即時に受け入れることが できない他のファイルを使用すると、結果は次のいずれかに なります。
  • O_NONBLOCK が設定されていない場合には、write() は データの書き込みが可能になるまでブロックします。
  • O_NONBLOCK が設定されると、write() はプロセスをブロックしません。プロセスをブロックしないで一部のデータを書き込める場合には、write() は書き込めるものを書き込み、書き込まれたバイト数を戻します。 そうでない場合には、errno を EAGAIN に設定して、-1 を戻します。
次の条件がすべて該当する場合には、write() によって シグナル SIGTTOU は送信されます。
  • プロセスがその制御端末に書き込みを試みていて、TOSTOP が 端末属性として設定されている。
  • プロセスがバックグラウンド・プロセス・グループで実行して いて、SIGTTOU シグナルがブロックまたは無視されていない。
  • プロセスが孤立していない。

write() が正常に行われると、ファイルの変更時間と修正時間が 更新されます。

fs がソケットを参照している場合には、write() は、フラグが設定されていない send() と同じです。

ソケットの場合の動作 : write() 関数は、バッファーから記述子 fs を持つソケット上へデータを書き込みます。ソケットは、接続されたソケットでなくてはなりません。この呼び出しは、最大で N バイトの データを書き込みます。
パラメーター
説明
fs
ファイルまたはソケットの記述子。
buf
書き込まれるデータを保留するバッファーを指すポインター。
N
buf パラメーターが指すバッファーの 長さ (バイト単位)。

送信するソケット・データを保持するのに使用できるバッファー・スペースの大きさが十分ではなく、ソケットがブロック・モードの場合には、追加のバッファー・スペースが使用可能になるまで、write() は、呼び出し元をブロックします。ソケットが非ブロック・モードの場合には、write() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロック・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照して ください。

ソケットでデータの受け入れが可能になっていなく、プロセスが データをソケットに書き込もうとしているときには、次のとおり になります。
  • FNDELAY または O_NONBLOCK が設定されていない限り、write() は、ソケットでデータの受け入れが可能になるまでブロックします。
  • FNDELAY が設定されると、write() は、0 を戻します。
  • O_NONBLOCK が設定されると、write() はプロセスをブロックしません。プロセスをブロックしないで一部のデータを書き込める場合には、write() は書き込めるものを書き込み、書き込まれたバイト数を戻します。そうでない場合には、writev() は、エラー・コードを EAGAIN に設定し、-1 を戻します。

データグラム・ソケットの場合、データグラムが TCP/IP バッファーに適合すれば、この呼び出しはデータグラム全体を送信します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション・プログラムが 1000 バイトを 送信したい場合には、この関数を呼び出すたびに 1 バイト または 10 バイトあるいは 1000 バイト全部を送信できます。したがって、ストリーム・ソケットを使用するアプリケーション・プログラムは この呼び出しをループに配置して、すべてのデータが送信されるまで この関数を呼び出す必要があります。

C++ およびソケットの特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

正常に実行された場合、write() は N 以下の 実際に書き込まれたバイト数を戻します。

0 またはそれより大きい値は、送信されたバイト数を示しています。しかし、これはデータの送達が完了したことを 保証するわけではありません。データの送達が完了していない場合は、ピア・ソケットおよびあとで生成された SIGPIPE シグナルを使って接続を終了することができます。

正常に実行されなかった場合、write() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
リソースは一時的に使用できません。以降の要求は正常に 完了できます。
EBADF
fs が、有効なファイルまたはソケット記述子ではあり ません。
ECONNRESET
接続はピアによって強制的にクローズされました。
EDESTADDRREQ
ソケットは接続目的でないため、ピア・アドレスは設定されません。
EFAULT
buf および N パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージへのアクセスを試みる結果になります。
EFBIG
出力ファイルに書き込むと、インプリメンテーションによって サポートされる最大ファイル・サイズを超えることがあります。

システム設定の最大ファイル・サイズ、またはプロセスのファイル・サイズ制限を超えるファイルを書き込もうとしました。

ファイルは通常のファイルであり、nbyte は 0 より大きく、開始位置は、フィールドに関連したオープン・ファイル記述で設定されたオフセットの最大値より 大きいかまたは等しくなっています。

EINTR
出力を書き込む前に write() にシグナルが割り込みました。
EINVAL
要求が無効か、またはサポートされていません。fs が 参照する STREAM またはマルチプレクサーは、マルチプレクサーから ダウンストリームへ (直接または間接に) リンクされます。
EIO
プロセスはバックグラウンド・プロセス・グループに入って いて、制御端末に書き込もうとしていますが、(termios.h ヘッダー・ファイルに定義されている) TOSTOP が 設定され、プロセスは SIGTTOU シグナルを無視もブロックもしていなく、プロセスのプロセス・グループは孤立しています。入出力エラーが発生しました。
EMSGSIZE
メッセージが大きすぎて、1 つのデータグラムとして送信されませんでした。
ENOBUFS
メッセージの送信にバッファー・スペースを使用することができません。
ENOSPC
出力装置には使用可能なスペースが残っていません。
ENOTCONN
ソケットが接続していません。
ENXIO
書き込もうとしている STREAM でハングアップが発生しました。
EPIPE
write() は、他のプロセスが読み取るためにオープンして いないパイプに書き込もうとしています。このエラーは SIGPIPE シグナルも生成します。接続されたストリーム・ソケットの場合には、ピア・ソケット との接続が失われています。
ERANGE
転送要求サイズは、fs と 関連した STREAMS ファイルによってサポートされた範囲を超えて いました。
EWOULDBLOCK
socket は非ブロック・モードであり、使用可能なデータ・バッファーがないか、バッファーが使用可能になる前に SO_SNDTIMEO タイムアウト値に達しました。

STREAM ヘッドでエラー・メッセージを受信した場合には、STREAMS ファイルへの書き込みは失敗することがあります。この場合には、errno はエラー・メッセージにインクルードされた値に 設定されます。

注: z/OS® UNIX システム・サービスは、どのような STREAMS 装置または疑似装置も提 供しません。write() が STREAM 上にデータを書き込むことは、不可能です。呼び出し側で見ることができる STREAMS errno はありません。open() — ファイルのオープンを参照してください。

CELEBW35
⁄* CELEBW35

   This example writes a certain amount of bytes to a file, using write().

 *⁄
#define _POSIX_SOURCE
#include <fcntl.h>
#include <sys⁄stat.h>
#include <sys⁄types.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdlib.h>
#include <stdio.h>

#define mega_string_len 1000000

main() {
  char *mega_string;
  int  fd, ret;
  char fn[]="write.file";

  if ((mega_string = (char*) malloc(mega_string_len)) == NULL)
    perror("malloc() error");
  else if ((fd = creat(fn, S_IWUSR)) < 0)
    perror("creat() error");
  else {
    memset(mega_string, '0', mega_string_len);
    if ((ret = write(fd, mega_string, mega_string_len)) == -1)
      perror("write() error");
    else printf("write() wrote %d bytes¥n", ret);
    close(fd);
    unlink(fn);
  }
}
出力:
write() wrote 1000000 bytes

関連情報