| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 2 : システムコール > wwrite(2)HP-UX 11i Version 2: September 2004 |
|
名称write, writev, pwrite ― ファイルへの書き込み 構文#include <unistd.h> 説明write() 関数は buf が指しているバッファーから、オープンしているファイル記述子 fildes に対応するファイルへ nbyte バイトを 書き出します。 nbyte として 0 をが指定されたときは、ファイルが通常のファイルであれば、 write() は 0 を返すだけで、その他の処理を行いません。 しかし、ファイルが通常のファイルでない場合は、結果が保証されません。 通常のファイルまたは他のシーク可能なファイルでは、 データの実際の書き込みは、 fildes に対応するファイルオフセットの示しているファイル内の位置から開始します。 write() から正常に戻る前に、 ファイルオフセットを実際に書き込まれたバイト数だけ増加します。 通常のファイルでは、増加したファイルオフセットがファイルのサイズ (大きさ) を超える場合、 このファイルオフセットにはファイルのサイズがセットされます。 対象が通常のファイルの場合は、ファイルステータス フラグの O_DSYNC フラグがセットされていると、ファイルデータの更新とデータの検索に必要なファイル属性の更新が両方とも実際に完了するまで、write は戻りません。 O_SYNC フラグがセットされている場合は、 O_DSYNC がセットされている場合の処理に加えて、 書き込み操作によって変更されるすべてのファイル属性 (アクセス時刻、修正時刻、およびステータス変更時刻を含む) も、呼び出し元プロセスへ戻る前に実際に更新されます。 対象がブロック型特殊ファイルの場合は、 O_DSYNC または O_SYNC フラグがセットされていると、データが実際に更新されるまで write は戻りません。 データが実際の記憶媒体にどのような手段で送られるかは、インプリメンテーションおよびハードウェアに依存します。 書き込み対象が通常ファイルの場合は、ファイルとレコードの強制ロッキングモードが設定されている状態で、その書き込み対象ファイルのセグメントが他のプロセスによってロックされていると、書き込みが妨げられます。 このとき、フラグの状態によって次のように処理されます。
ファイルステータス フラグの O_APPEND フラグがセットされると、書き込みの前に、ファイルオフセットがファイルの最後にセットされ、ファイルオフセットの変更と書き込み操作の間に、中間的なファイル変更操作は発生しません。 write() に要求した書き込みバイト数が、 書き込み可能な空き容量 ulimit や媒体の物理的限界などで制限される) より多い場合は、空いているバイト数分のデータだけが実際に書き込まれます。 たとえば、ファイルが一杯になるまであと 20 バイトのスペースしか空いていない場合に 512 バイト書き込もうとすると、20 バイトだけが書き込まれ、戻り値として 20 が返されます。 その後、つまり空きスペースのない状態で 1 バイト以上のデータを書き込もうとすると、(後述以外の場合を除いて) write は失敗し、 インプリメンテーションからそのプロセスに対して、 シグナル SIGXFSZ が送られます。 データを書き込む 前に シグナルによって中断された場合、 write() は errno に EINTR をセットして、 -1 を返します。 一部のデータを書き込んだ 後に シグナルによって中断された場合、 write() は、中断される前に書き込んだバイト数を返します。 nbyte の値が {SSIZE_MAX} より大きい場合の結果は、インプリメンテーションに依存します。 通常のファイルに対する書き込み (write()) が正常終了した後に、その変更部分に対して読み取りまたは書き込みを行うと、次のように処理されます。
パイプまたは FIFO に対する書き込み要求は、次の点を除いて通常のファイルと同様に処理されます。
ファイルステータス フラグ O_NDELAY または O_NONBLOCK がセットされている場合にパイプに対して書き込みを行うと、次の条件が適用されます。
O_NDELAY ファイルステータス フラグと O_NONBLOCK ファイルステータス フラグがクリアされている場合にパイプに対して書き込みを行うと、 write() は (必要ならば、ブロックしながら) 正常に処理を実行し、書き込んだバイト数を返します。 非ブロック書き込みをサポートしている (パイプまたは FIFO 以外の) ファイル記述子に対して書き込みを行った場合、そのファイルがデータを即座に受け取れないときは、以下のように処理されます。
nbyte が 0 より大となって正常終了すると、 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() は失敗し、 errno が EAGAIN にセットされます。 STREAMS デバイスにサイズ 0 nbyte が 0) のバッファーを書き込むと、0 バイトを送信して 0 を返します。 しかし、STREAM をベースにしたパイプまたは FIFO にサイズ 0 のバッファーを書き込むと、メッセージを送信せずに 0 を返します。 プロセスがパイプまたは FIFO を経由してサイズ 0 のメッセージを送信できるようにするには、 I_SWROPT ioctl() を実行します。 STREAM に書き込みを行うと、優先順位帯域が 0 のデータメッセージが作成されます。 パイプまたは FIFO でない STREAM に書き込みを行うと、次のように処理されます。
さらに、 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 にその値をセットします。
writev() 関数は、次の場合に失敗し、 errno に次の値をセットします。
writev() 関数は、次の場合に失敗し、 errno に次の値をセットすることがあります。
pwrite() 関数は、次の場合に失敗し、 errno に次の値を設定します。 ファイルポインターは変更されません。
write() または writev() は、次の場合に失敗します。このエラーの場合は、転送されたデータの量だけ、ファイルのオフセットが更新されます。 errno に次の値がセットされます。
例プロセスが書き込み用にファイルをオープンしたとすると、 以下の write() への呼び出しは、 mybuf が指すバッファーから mybufsize バイトをファイルに書き込もうとします。 #include <string.h> 警告sigvector() をサポートしているシステムの signal の参照の妥当性については、 signal(5) をチェックしてください。 また、 sigvector(2) のマンページも参照してください。 sigvector() は、このページに記述されている write()、 writev()、 および pwrite() の動作に影響を与えることがあります。 キャラクタ型特殊デバイス、および特に raw のディスクは、 write() の使用法に対して制約を与えます。 個々のデバイスについての詳細は、 このマニュアルの第 7 章を参照してください。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||