私はSIGINT
ハンドラを持っています。プログラム全体の変数を設定します:errflag
。 select()
を実行してSIGINT
で中断した場合、errflag
をチェックしてSIGINT
(errflag
に割り当てられた独自の定数を持つ)かどうかを確認します。ただし、ハンドラが遅くなり、errflag
がまだ設定されていない可能性があります。ハンドラの解決前に処理を延期する方法はerrflag
?またはこれを正しく実装する方法は?シグナルハンドラが確実に終了してからプログラムを続行する方法を確認するには?
select()
は、Ctrl-Cの-1
を返します。errno
は、EINTR
です。ここでハンドラは決して遅くはない。他のパスでselect()
が-1
、errno
がEINTR
の場合でも、少し遅れてログメッセージが出力され、遅い場合はerrflag
チェックが既に実行されています。
最初の答えで指摘したように、割り込みは現在の処理を停止してハンドラを実行し、ハンドラが返ってくるとシステムコールを再起動するか、 'errno'を' EINTR'に設定して割り込みを中断します。あなたは 'signal()'や 'sigaction()'を使っていますか?あなたのコードがないと、何がうまくいかないのか分かりにくいですが、シグナルハンドラが「遅延」する可能性があるという解釈は基本的には間違っています。 'sigaction()'では、別のシグナルが 'sa_mask'で処理されている間にシグナルをブロックすることができますが、ブロックされたシグナルは最初のハンドラが返ったときに配信されます。 –
@JonathanLeffler:はい、あなたは正しいです。シグナルはキューメカニズムによって手動で遅延され、ハンドラの早期復帰、その前にデバッグされず、最初から最後の呼び出しとしてfrom-queueコールが解釈されます。 – Itzie
したがって、2つ以上の出口ルートを持つシグナルハンドラがあり、1つは診断プリントが施されていて、もう1つは実行されていませんでしたか?簡単に行うことができますが、見るべきこともあります。結果が深刻に誤解される可能性があります。 'シングルエントリー、シングル出口'プログラミングのメリットの1つは、あなたがその問題にぶつからないということです! –