これはIs a successful send() "atomic"?へのフォローアップの質問です。実際には、ソケットで送信するだけでなく、一般的にはシステムコールに関係していると思います。システムコールはどのように中断されますか?
どのシステムコールが中断され、いつ中断が処理されますか?私はSA_RESTARTについて学んだが、何が起こっているかを正確に理解していない。
私はSA_RESTARTせずにシステムコールを行う場合は、コールが自分のアプリケーションに関係するが、私の呼び出しを中止し、何かをするためにOSを必要としない割り込みのいずれかの種類(例えば、ユーザ入力)によって中断することができますそれ以外は?または、それは私のプロセス(CTRL + C、ソケットクローズ、...)に直接関わるシグナルによってのみ中断されますか?
SA_RESTARTを設定するとき、send()や他の「遅い」システムコールのセマンティクスとは何ですか?すべてのデータが送信されるか、ソケットがダウンするか、send()のパラメータの数よりも小さい数値で返されるまで、常にブロックされますか?
ここで、再起動は実装されていますか? OSは、割り込みが発生したときにコールを再開させたい、またはプロセスに送信された信号がライブラリコードで処理されることを知っていますか?それとも、自分でやらなければならないのですか? whileループで呼び出しをラップし、必要に応じて頻繁に再試行しますか?
これは私のプロセスに送信されるシグナルだけを意味します。私は何とか私の割り込み(キー押下、マウス移動、タイマー割り込み、...)を処理するカーネルの中断が私の呼び出しを戻し、信号を送る原因になると考えていました。 システムコール中のコンテキストスイッチは、時間以外の方法で自分のプロセスに干渉してはいけませんか? – lxgr
@lxgr、それは正しいです、コンテキスト切り替えはシステムコールを中止しません。 –