を呼び出し、書き込み()の呼び出しは、要求されたよりも少ないバイトを書いてしまうことがあります。)は(不完全な書き込みの取り扱いのLinux/Unixでは
書き込まれたバイト数は、例えば、もしカウント未満であってもよい、 (RECIMIT_FSIZEのリソース制限を参照)、 未満のバイトを書き込んだ後に、シグナルハンドラによって コールが中断されました。 (pipe(7)も参照)
C標準ライブラリのfwrite()も同じ動作をします。私が見たほとんどのコードは次のようにエラーを処理するために選択し、この可能性を無視します:
int ret = write(fd, buf, size);
if (ret < 0) {
printf("Couldn't write %s: %s\n", path, strerror(errno));
exit(1);
}
我々は
if (ret != size) {
printf("Couldn't write %s: %s\n", path, strerror(errno));
exit(1);
}
をチェックしているように、私は個人的に条件を変更するのが習慣に得ていますこれはこの状態に気付く。
Couldn't write /some/file: Success
私は、これはあまりにも驚くべきことではないと仮定します。しかし、私はまた私のプログラムは時々で終了することに気付きました。しかし、このケースを扱うための標準的で堅牢でクリーンな方法は何ですか?明らかに "サイレントデータの破損" ---これまでのすべてのチュートリアルの動作であるように思われます---うまくいきません。私はこのケースを特別に検出して終了するように自分のコードを修正することができました。
しかし、man 2 writeで提供される例は単なる例です。もう一度やり直す方法がありますか(EINTRは例です...)?これらを検出するにはどうすればよいですか、もっと重要なのは、すべてのケースを処理したことを確認することですか?これらのエラーハンドラを作成するための標準的なクリーンな方法はありませんか?何も2つの状況下で書き込まれていない場合
書き込みは* write * someまたはすべてのデータで成功することができます。この場合、 'errno'を設定せずに書き込まれたデータの量を返します。常に '-1'を返し、' errno'をセットします。例えば、 'write()'が*いくつかの*データを書き込んだ後にシグナルによって中断された場合、 'errno'を' EINTR'に設定しません。これは 'write()'が中断されて、まったく。その結果、 'write()'は、 'size'の値が正の値で呼び出されたとき、決して' 0'を返しません。 – fuz
私はそれを得るために始めている参照してください。これを利用して、私はwrite()が*いくつかの*データの書き込みに成功した後、直ちに操作を繰り返すと、*それ以上のデータを書き込むことができず、 "デバイス上にスペースが残っていません。私は、無限の "データを書くことはできませんが、エラーもありません"というループに陥ることを恐れていました。 –
データが書き込まれていない場合、 'write()'は 'size'に0を渡さない限りエラーを返します。エラー状態がなければ0を返すことができます。 'write()'は、私が知る限り0以外の長さの引数に対して0を返すことはできません。 – fuz