4

私は C で Web サーバーを作成しており、エラー時に -1 を返し、「errno」変数に適切な値を設定するシステム コールをよく使用します。一部のシステム コールは、EINTR や EAGAIN を返すことができます。これらのエラー値の両方を使用し、システム コールを再試行する 2 つのラッパー HANDLE_EINTR、HANDLE_EAGAIN があります。

通常、システム コールが EINTR や EAGAIN を返すかどうかはマニュアル ページに記載されていますが、実際には返されないシステム コールもあります。また、一部のシステム コールは EINTR / EAGAIN を直接返すのではなく、その中で使用されている可能性のある他のシステム コールの失敗を通じて返す場合があります。

API が何を宣言しているかに関係なく、HANDLE_EINTR や HANDLE_EAGAIN を使用できるかどうかを尋ねたいと思います (これは必ずしも完全ではありません)。

また、Google の人々から、「close」システム コールで HANDLE_EINTR を使用することは (API はそれを使用することを参照していますが) 良い考えではないことを知っているので、使用しません。この動作を持つ他のシステム コールはありますか?

ありがとうございました。

4

1 に答える 1

0

EINTRとのセマンティクスはEAGAIN明確に定義されています。特定のシステム コールが特定の を返す可能性があると文書化されていない場合、そのerrnoためのハンドラを用意しても問題はありません。

特定のシステム コールが文書化されていない場合でも、大規模なアプリケーションが広範囲の に対して適切なアクションを実行する単一のエラー ハンドラを実装し、errno同じエラー ハンドラを使用して多くの異なるシステム コールからのエラー状態を適切に処理することは非常に一般的です。特定の を返す可能性がありerrnoます。

于 2014-09-07T14:29:14.507 に答える