処理方法の決定は常にEINTR
ユーザーに任せ、必要に応じて操作を簡単に再開できるようにします。
通常、これを行うための最良の方法は、ライブラリ関数から呼び出し元に戻ることですEINTR
が、場合によっては、コールバックまたは他の実装の方が優れていることもあります。どちらの方法が他の要因に最適であるかは常に異なりますが、ユーザーが常に再試行して、履歴書。
つまり、ライブラリコードがを取得する前に部分的に成功するEINTR
可能性がある場合、その部分的な成功についてユーザーが何を知る必要があるか、またはユーザーが失敗したところから操作を再開する必要があるかどうかを慎重に検討する必要があります。追加情報を返すか、適切な場所から再開するためのインターフェースを提供する必要がある場合があります。
これが、システムコールが次のようにread
なり、write
今日では部分的な成功を返す理由です。
あなたは書こう"foo"
と我々は成功したのいずれか何も書いていない、または"f"
、あるいは"fo"
、あなたはどの知るために得ることはありません。楽しんで!あなたのシステムがそれらのいずれかの後に書き込み全体の再開を処理できることを願っています!
もちろん、場合によっては、まさにそのような状況を処理するシステムを作成する必要があります。たとえば、おそらく部分的な書き込みの後、常にファイルを再作成するか、ネットワーク接続を再度開くか、またはバイトを使用して「やり直し」を意味します-そのため、ライブラリが対象とするユースケースによって異なります。
ライブラリ関数がいくつかの操作を実行し、どの操作で失敗したかを知る方法がなく、それらの操作がすべて安全かつ効率的にべき等であるとは限らない場合、基本的に、堅牢にする必要があるコードでライブラリを使用できなくなります。
ライブラリ関数のすべてのステップが安全かつ効率的にべき等である場合、またはロックの取得のようにすべてがアトミックである場合は、EINTR
発生したことで十分であることをユーザーに通知するだけです。
また、で再試行するとEINTR
、シグナル処理が中断する可能性があります。低レベルでは、シグナルハンドラーは安全に使用できる機能のセットが限られているため、多くの場合、シグナルハンドラーはブール値を設定してシグナルを受信したことを示し、コードが再開すると期待して戻ります。それがやっていたことから抜け出す。を取得EINTR
し、ユーザーに制御を返す代わりに再試行する場合、コードがそれを行わない可能性があります。
何の後に行うことEINTR
で、プログラム全体の決定正しい答えは、プログラムがやって、どのようにプログラムが信号に応答するものとする、そして、それはプログラムの残りの部分への影響を持っているものを知らなくても知ることができません- 。
ユーザーが再開する必要があるかどうか、または再開する必要があるかどうかを知り、必要に応じてユーザーを支援することは、ライブラリーの責任です。ライブラリーが何をしているかを知らない限り、正しい答えはわかりません。
EINTR
して呼び出し元に報告する)を承認する傾向がありますが、それはあなたのライブラリが何をしているかに依存するかもしれません...