標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <unistd.h>
ssize_t write(int fs, const void *buf, size_t N);
#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() が正常に行われると、ファイルの変更時間と修正時間が 更新されます。
fs がソケットを参照している場合には、write() は、フラグが設定されていない send() と同じです。
送信するソケット・データを保持するのに使用できるバッファー・スペースの大きさが十分ではなく、ソケットがブロック・モードの場合には、追加のバッファー・スペースが使用可能になるまで、write() は、呼び出し元をブロックします。ソケットが非ブロック・モードの場合には、write() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロック・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照して ください。
データグラム・ソケットの場合、データグラムが 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 シグナルを使って接続を終了することができます。
システム設定の最大ファイル・サイズ、またはプロセスのファイル・サイズ制限を超えるファイルを書き込もうとしました。
ファイルは通常のファイルであり、nbyte は 0 より大きく、開始位置は、フィールドに関連したオープン・ファイル記述で設定されたオフセットの最大値より 大きいかまたは等しくなっています。
STREAM ヘッドでエラー・メッセージを受信した場合には、STREAMS ファイルへの書き込みは失敗することがあります。この場合には、errno はエラー・メッセージにインクルードされた値に 設定されます。
⁄* 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