2011-11-08 12 views
16

これはIs a successful send() "atomic"?へのフォローアップの質問です。実際には、ソケットで送信するだけでなく、一般的にはシステムコールに関係していると思います。システムコールはどのように中断されますか?

どのシステムコールが中断され、いつ中断が処理されますか?私はSA_RESTARTについて学んだが、何が起こっているかを正確に理解していない。

  • 私はSA_RESTARTせずにシステムコールを行う場合は、コールが自分のアプリケーションに関係するが、私の呼び出しを中止し、何かをするためにOSを必要としない割り込みのいずれかの種類(例えば、ユーザ入力)によって中断することができますそれ以外は?または、それは私のプロセス(CTRL + C、ソケットクローズ、...)に直接関わるシグナルによってのみ中断されますか?

  • SA_RESTARTを設定するとき、send()や他の「遅い」システムコールのセマンティクスとは何ですか?すべてのデータが送信されるか、ソケットがダウンするか、send()のパラメータの数よりも小さい数値で返されるまで、常にブロックされますか?

  • ここで、再起動は実装されていますか? OSは、割り込みが発生したときにコールを再開させたい、またはプロセスに送信された信号がライブラリコードで処理されることを知っていますか?それとも、自分でやらなければならないのですか? whileループで呼び出しをラップし、必要に応じて頻繁に再試行しますか?

答えて

9

システムコールは任意signalによって中断することができ、これは等(CTRL-Cによって生成される)SIGINT、SIGHUP、このような信号を含む

SA_RESTARTが設定されている場合、send()を用いて(戻ります送信されたタイムアウトが設定されている場合はエラーEINTRを返します(再起動できない場合)。send()が再起動されます。

システムコールの再起動は、カーネルのシグナル処理コードで実装されています。保留中のシグナルを検出すると(または信号によって割り込みが中断されたとき)、システムコールは内部で-ERESTARTSYSを返します。これにより、シグナルハンドラコードは命令ポインタと関連レジスタを呼び出し前の状態に復元し、システムコールを繰り返します。

+1

これは私のプロセスに送信されるシグナルだけを意味します。私は何とか私の割り込み(キー押下、マウス移動、タイマー割り込み、...)を処理するカーネルの中断が私の呼び出しを戻し、信号を送る原因になると考えていました。 システムコール中のコンテキストスイッチは、時間以外の方法で自分のプロセスに干渉してはいけませんか? – lxgr

+1

@lxgr、それは正しいです、コンテキスト切り替えはシステムコールを中止しません。 –

関連する問題