本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 2 : システムコール > w

write(2)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

write, writev, pwrite ― ファイルへの書き込み

構文

#include <unistd.h> 
 
ssize_t write(int fildes, const void *buf, size_t nbyte); 
 
ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 
 
#include <sys/uio.h> 
 
ssize_t writev(int fildes, const struct iovec *iov, int iovcnt); 

説明

write() 関数は buf が指しているバッファーから、オープンしているファイル記述子 fildes に対応するファイルへ nbyte バイトを 書き出します。

nbyte として 0 をが指定されたときは、ファイルが通常のファイルであれば、 write()0 を返すだけで、その他の処理を行いません。 しかし、ファイルが通常のファイルでない場合は、結果が保証されません。

通常のファイルまたは他のシーク可能なファイルでは、 データの実際の書き込みは、 fildes に対応するファイルオフセットの示しているファイル内の位置から開始します。 write() から正常に戻る前に、 ファイルオフセットを実際に書き込まれたバイト数だけ増加します。 通常のファイルでは、増加したファイルオフセットがファイルのサイズ (大きさ) を超える場合、 このファイルオフセットにはファイルのサイズがセットされます。

対象が通常のファイルの場合は、ファイルステータス フラグの O_DSYNC フラグがセットされていると、ファイルデータの更新とデータの検索に必要なファイル属性の更新が両方とも実際に完了するまで、write は戻りません。 O_SYNC フラグがセットされている場合は、 O_DSYNC がセットされている場合の処理に加えて、 書き込み操作によって変更されるすべてのファイル属性 (アクセス時刻、修正時刻、およびステータス変更時刻を含む) も、呼び出し元プロセスへ戻る前に実際に更新されます。

対象がブロック型特殊ファイルの場合は、 O_DSYNC または O_SYNC フラグがセットされていると、データが実際に更新されるまで write は戻りません。 データが実際の記憶媒体にどのような手段で送られるかは、インプリメンテーションおよびハードウェアに依存します。

書き込み対象が通常ファイルの場合は、ファイルとレコードの強制ロッキングモードが設定されている状態で、その書き込み対象ファイルのセグメントが他のプロセスによってロックされていると、書き込みが妨げられます。 このとき、フラグの状態によって次のように処理されます。

  • O_NDELAY または O_NONBLOCK がセットされていると、write は errnoEAGAIN をセットし、 -1 を返します。

  • O_NDELAYO_NONBLOCK がクリアされていると、ブロックの要因になっているレコードロックが解除されるまで、write は完了しません。

ファイルステータス フラグの O_APPEND フラグがセットされると、書き込みの前に、ファイルオフセットがファイルの最後にセットされ、ファイルオフセットの変更と書き込み操作の間に、中間的なファイル変更操作は発生しません。

write() に要求した書き込みバイト数が、 書き込み可能な空き容量 ulimit や媒体の物理的限界などで制限される) より多い場合は、空いているバイト数分のデータだけが実際に書き込まれます。 たとえば、ファイルが一杯になるまであと 20 バイトのスペースしか空いていない場合に 512 バイト書き込もうとすると、20 バイトだけが書き込まれ、戻り値として 20 が返されます。 その後、つまり空きスペースのない状態で 1 バイト以上のデータを書き込もうとすると、(後述以外の場合を除いて) write は失敗し、 インプリメンテーションからそのプロセスに対して、 シグナル SIGXFSZ が送られます。

データを書き込む 前に シグナルによって中断された場合、 write()errnoEINTR をセットして、 -1 を返します。 一部のデータを書き込んだ 後に シグナルによって中断された場合、 write() は、中断される前に書き込んだバイト数を返します。 nbyte の値が {SSIZE_MAX} より大きい場合の結果は、インプリメンテーションに依存します。

通常のファイルに対する書き込み (write()) が正常終了した後に、その変更部分に対して読み取りまたは書き込みを行うと、次のように処理されます。

  • 書き込み操作によって変更されたファイルに対して、その変更部分のバイト位置から read() を行うと、 その変更部分が再び変更されるまでは、 write() で書き込んだデータが読み込みデータに反映されます (read が成功した場合)。

  • write で変更した部分 (バイト位置) に対して再び write() を実行すると、その部分が新しいデータで上書きされます。

パイプまたは FIFO に対する書き込み要求は、次の点を除いて通常のファイルと同様に処理されます。

  • パイプにはファイルオフセット対応するものがないため、書き込み要求はすべてパイプの最後に追加されます。

  • パイプまたは FIFO に格納できる最大バイト数はシステムに依存しており、その値は PIPSIZ (<sys/inode.h> で定義されている) です。

  • どの HP-UX システムでも、 PIPSIZ の最小値は 8192 です。

ファイルステータス フラグ O_NDELAY または O_NONBLOCK がセットされている場合にパイプに対して書き込みを行うと、次の条件が適用されます。

  • nbytePIPSIZ と等しいかまたはそれ以下で、パイプまたは FIFO に十分な空きスペースが存在する場合、 write() は正常終了し、書き込んだバイト数を返します。

  • nbytePIPSIZ と等しいかまたはそれ以下でも、パイプまたは FIFO に十分な空きスペースが存在しない場合、 write() は何も書き込まずにリターンします。 O_NONBLOCK がセットされていると、 errno に [EAGAIN] をセットし、 -1 を返します。 O_NDELAY がセットされていると、 0 を返します。

  • nbytePIPSIZ より大きく、 パイプまたは FIFO に空きがない場合、write は何も書き込まずにリターンします。 O_NONBLOCK がセットされていると、 errnoEAGAIN をセットし、 -1 を返します。 O_NDELAY がセットされていると、 0 を返します。

  • nbytePIPSIZ より大きく、パイプまたは FIFO にいくらかの空きスペースがある場合、 write() は、要求されたバイト数からパイプまたは FIFO の空きスペース分だけデータを書き込み、その実際に書き込んだバイト数を返します。

O_NDELAY ファイルステータス フラグと O_NONBLOCK ファイルステータス フラグがクリアされている場合にパイプに対して書き込みを行うと、 write() は (必要ならば、ブロックしながら) 正常に処理を実行し、書き込んだバイト数を返します。

非ブロック書き込みをサポートしている (パイプまたは FIFO 以外の) ファイル記述子に対して書き込みを行った場合、そのファイルがデータを即座に受け取れないときは、以下のように処理されます。

  • O_NONBLOCK フラグがクリアされている場合、データの受け入れが可能になるまで write() はプロセスをブロックします。

  • O_NONBLOCK フラグがセットされている場合、 write() はプロセスをブロックしません。 この場合、プロセスをブロックせずに書き込めるデータがあれば、 write() は空きスペース分だけそのデータを書き込み、実際に書き込んだそのバイト数を返します。 それ以外の場合、 write()errnoEAGAIN をセットし、 -1 を返します。

nbyte0 より大となって正常終了すると、 write() はそのファイルの st_ctime および st_mtime フィールドに更新のマークを付け、ファイルが通常のファイルであれば、ファイルモードの S_ISUID および S_ISGID ビットはクリアされます。

キャラクタ型特殊デバイスでは、デバイスをオープンした後にそのデバイスに対して stopio() の呼び出しが使用されていると、 write() はプロセスに SIGHUP シグナルを送るとともに、 errno に [EBADF] をセットし、 -1 を返します。 また write() は、そのファイルに対して potential および granted 特権ベクターをクリアします。

fildes が STREAM を参照している場合、 write() の操作は、STREAM が受け入れる最小の nbyte の値と最大の nbyte の値の範囲 (「パケットサイズ」) によって決定されます。 これらの値は、STREAM モジュールの最大値によって決定されます。 nbyte がパケットサイズの範囲内であれば、 nbyte バイトが書き込まれます。 nbyte がパケットサイズの範囲を超えており、最小パケットサイズの値が 0 であれば、 write() はデータを下流へ送る前に、最大パケットサイズのセグメントにバッファーを分けます (最後のセグメントは最大パケットサイズに満たないことがあります)。 nbyte がパケットサイズの範囲を超えており、最小パケットサイズの値が 0 でなければ、 write() は失敗し、 errnoEAGAIN にセットされます。 STREAMS デバイスにサイズ 0 nbyte が 0) のバッファーを書き込むと、0 バイトを送信して 0 を返します。 しかし、STREAM をベースにしたパイプまたは FIFO にサイズ 0 のバッファーを書き込むと、メッセージを送信せずに 0 を返します。 プロセスがパイプまたは FIFO を経由してサイズ 0 のメッセージを送信できるようにするには、 I_SWROPT ioctl() を実行します。

STREAM に書き込みを行うと、優先順位帯域が 0 のデータメッセージが作成されます。 パイプまたは FIFO でない STREAM に書き込みを行うと、次のように処理されます。

  • O_NONBLOCK がクリアされていて、 (STREAM の write キューが内部フローの制御状態により空きがないため) STREAM がデータを受け入れられない場合、データの受け入れが可能になるまで write() はプロセスをブロックします。

  • O_NONBLOCK がセットされていても、 STREAM がデータを受け入れないと、 write()errnoEAGAIN をセットし、 -1 を返します。

  • O_NONBLOCK がセットされていて、バッファーの一部を書き込んだあと、 STREAM がデータをこれ以上受け取れない状態が発生した場合、 write() は終了し、書き込んだバイト数を返します。

さらに、 STREAM のヘッドが呼び出しの前に非同期エラーを処理している場合は、 write() および writev() は失敗します。 この場合、 errno の値は、 write() または writev() の結果ではなく、前のエラーを反映します。

所有者でもなく適切な特権を持つユーザーでもないユーザーが write を実行すると、 write() は、ディレクトリ以外のすべてのファイルのセットユーザー ID ビット、セットグループ ID ビット、およびスティッキービットをクリアします。 所有者または適切な特権を持つユーザーが write を実行した場合の動作は、ファイルシステムによって異なります。 一部のファイルシステムでは、write によってディレクトリ以外のすべてのファイルのセットユーザー ID ビット、セットグループ ID ビット、およびスティッキービットがクリアされます。 また別のファイルシステムでは、ディレクトリ以外のファイルに対して write を実行しても、これらのビットはクリアされません。

ディレクトリについては、 write() を実行しても、セットユーザー ID ビット、セットグループ ID ビット、およびスティッキービットはクリアされません。

writev() 関数は、 write() と同様の機能をもちますが、 iov 配列のメンバー iov[0], iov[1], ..., iov[iovcnt-1]) で指定されている iovcnt 個のバッファーからの出力データを集めます。 <limits.h> で定義されているように、 iovcnt の有効な値の範囲は、 1{IOV_MAX} です。

iovec エントリーは、データの書き込みを開始するメモリー領域の基底アドレスとサイズ (大きさ) を指定します。 writev() 関数は、次に進む前に常に完全な領域を書き込みます。 iovec 構造体は /usr/include/sys/uio.h に定義されています。

fildes が通常のファイルを参照し、 iov が指している配列中のすべての iov_len メンバーが 0 である場合、 writev()0 を返し、その他の効果はありません。 他のファイルタイプについては、動作が 保証されていません。

iov_len の値の総和が SSIZE_MAX より大きい場合は、失敗し、データは転送されません。

pwrite() 関数は、ファイルポインターを変更せずに所定の位置に書き込む点を除き、 write() と同じアクションを実行します。 pwrite() の最初の 3 つの引き数は write() と同じであり、ファイル内部の目的の位置用に 4 番目の引き数 offset が追加されています。

戻り値

write() および pwrite() が正常終了すると、 fildes に対応するファイルに実際に書き込まれたバイト数を返します。 この数字は、 nbyte 以下です。 失敗の場合は、 エラーの種類を示す値を errno にセットし、 -1 を返します。

writev() が正常終了すると、実際に書き込まれたバイト数を返します。 失敗の場合は、 エラーの種類を示す値を errno にセットし、 -1 を返します。ファイルポインターの値は変わりません。

STREAMS ファイルへの書き込みは、 STREAM の先頭でエラーメッセージを受け取ると、失敗することがあります。 この場合、 errno には、エラーメッセージに入っている値がセットされます。

エラー

write()pwrite()、 および writev() 関数は、次の場合に失敗し、 errno にその値をセットします。

EAGAIN 

ファイル記述子に対して O_NONBLOCK フラグがセットされているが、プロセスの要求した write() 操作をいますぐ実行できないので、少し時間をおいてから実行する必要がある場合

EAGAIN 

ファイル/レコードの強制ロッキングモードと O_NDELAY がセットされている状態で、書き込み対象のレコードにロックがかかっている場合

EBADF 

引き数 fildes で指定されたファイル記述子が、書き込み用にオープンされていない場合

EDEADLK 

この操作を実行するとリソースのデッドロックが発生する場合 lockf(2) および fcntl(2) を参照)

EDQUOT 

このファイルシステムで当該ユーザーに割り当てられているディスクブロックに、空きがなくなった場合

EFBIG 

インプリメンテーションに依存した最大ファイルサイズの制限またはそのプロセスのファイルサイズの制限を超えるファイルを書き込もうとした場合

EFBIG 

fildes で指定された対象ファイルが通常ファイルで、 nbyte も 0 より大きいが、書き込み開始位置が、その対象オープンファイルに対して設定されているオフセットの最大値と等しいか、または、それより大きい場合

EINTR 

シグナルを受信したために、データを送信しないままで書き込み操作が終了した場合

EINVAL 

fildes で指定された STREAM またはマルチプレクサが、マルチプレクサから (直接または間接に) 下流へリンクされている場合

EIO 

実際の入出力でエラーが発生した場合

EIO 

バックグラウンドプロセスグループのメンバーであるプロセスが、 TOSTOP のセットされている制御ターミナルに書き込もうとしたが、そのプロセスが SIGTTOU を無視もブロックもしていないのにもかかわらず、 そのプロセスのプロセスグループに親がないので知らせられない場合。 このエラーは処理系依存の条件によっても返されることがあります。

ENOLCK 

システムのレコードロック テーブルがいっぱいになっていて、 ブロックの原因となっているレコードロックが解除されるまで write がスリープできない場合

ENOSPC 

ファイルシステムに書き込みに必要なスペースが十分になく、 しかもそのプロセスに、この制約を無視できるような 制限 に対する有効な特権がない場合

ENXIO 

要求が、存在しないデバイスに対して行われたか、または、デバイスの機能を超えている場合

ENXIO 

書き込み中の STREAM でハングアップが発生した場合

EPIPE 

書き込み先のパイプまたは FIFO はオープンされているが、読み込み用にはオープンされていない場合。あるいは、書き込み先パイプまたは FIFO の入口か出口の一方しかオープンされていない場合。 このエラーの場合、シグナル SIGPIPE もプロセスに送られます。

ERANGE 

転送要求のサイズが、 fildes に対応する STREAMS ファイルでサポートされている範囲を超えている場合

writev() 関数は、次の場合に失敗し、 errno に次の値をセットします。

EFAULT 

iov_base または iov が、割り当てられていないアドレス空間を指している場合。 このエラーを確実に検出できるかどうかは、処理系に依存します。

EINVAL 

iov 配列の中の iov_len の値に、負になっているものがある場合

EINVAL 

iov 配列の中にある iov_len の値の総和が、 ssize_t を超えているる場合

writev() 関数は、次の場合に失敗し、 errno に次の値をセットすることがあります。

EINVAL 

引き数 iovcnt が 0 以下か、または {IOV_MAX} より大きい場合

pwrite() 関数は、次の場合に失敗し、 errno に次の値を設定します。 ファイルポインターは変更されません。

EINVAL 

offset 引き数が負の値になっている場合。負の値は無効です。

ESPIPE 

fildes がパイプまたは FIFO に関連づけられている場合

write() または writev() は、次の場合に失敗します。このエラーの場合は、転送されたデータの量だけ、ファイルのオフセットが更新されます。 errno に次の値がセットされます。

EFAULT 

buf が、プロセスに割り当てられていないアドレス空間を指している場合。 このエラーを確実に検出できるかどうかは、処理系に依存します。

プロセスが書き込み用にファイルをオープンしたとすると、 以下の write() への呼び出しは、 mybuf が指すバッファーから mybufsize バイトをファイルに書き込もうとします。

#include <string.h> 
 
int fildes; 
size_t mybufsize; 
ssize_t nbytes; 
char *mybuf = "aeiou and sometimes y"; 
mybufsize = (size_t)strlen (mybuf); 
nbytes = write (fildes, (void *)mybuf, mybufsize); 

警告

sigvector() をサポートしているシステムの signal の参照の妥当性については、 signal(5) をチェックしてください。 また、 sigvector(2) のマンページも参照してください。

sigvector() は、このページに記述されている write()、 writev()、 および pwrite() の動作に影響を与えることがあります。

キャラクタ型特殊デバイス、および特に raw のディスクは、 write() の使用法に対して制約を与えます。 個々のデバイスについての詳細は、 このマニュアルの第 7 章を参照してください。

著者

write() は HP, AT&T およびカリフォルニア大学バークレイ校で開発されました。

参照

mkfs(1M), chmod(2), creat(2), dup(2), fcntl(2), getrlimit(2), lockf(2), lseek(2), open(2), pipe(2), sigvector(2), ulimit(2), ustat(2), signal(5), <limits.h>, <stropts.h>, <sys/uio.h>, <unistd.h>

標準準拠

write(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, POSIX.4

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.