通常、プロセスを終了するには、次の信号を生成しSIGKILL
ますSIGTSTP
。
しかし、誰が特定のシグナルを発行したのか、誰が特定のプロセスにシグナルを送信したのか、シグナルが一般にどのように機能するのか、どうすればわかりますか?信号は内部的にどのように機能しますか?
ベストアンサー1
50,000フィートでの視野は次のとおりです。
信号は、カーネル(
SIGSEGV
無効なアドレスにアクセスしたり+SIGQUIT
キーを押すなど)やシステムコール(または複数の関連コール)を使用するプログラムによって内部的に生成されます。Ctrl\kill
システムコールの1つによって実行されると、カーネルはコールプロセスにシグナルを送信するのに十分な権限があることを確認します。それ以外の場合はエラーが返されます(信号は発生しません)。
2つの特殊信号のうちの1つである場合、カーネルはターゲットプロセスの入力なしで無条件にその信号に対して機能します。これら2つの特殊信号はSIGKILLとSIGSTOPです。基本的な作業、信号の遮断などに関する以下のすべての内容は、これらのいずれかに関連していません。
次に、カーネルは信号で何をすべきかを調べます。
各プロセスについて、各信号には関連するアクションがあります。多くのデフォルト値があり、プログラムは
sigaction
他を使用して他のデフォルト値を設定できます。signal
これには、「完全に無視」、「プロセス終了」、「コアダンプを使用したプロセスの終了」、「プロセスの停止」などが含まれます。プログラムは信号ごとに信号伝達(「ブロック」)をオフにすることもできます。その後、信号はブロック解除されるまで保留のままです。
プログラムは、カーネルがそれ自体で特定の操作を実行せずに、代わりに同期(、待機、または
sigwait
使用signalfd
)または非同期(プロセスが実行しているすべての操作を中断し、指定された関数を呼び出す)としてプロセスにシグナルを渡すように要求できます。
「リアルタイム信号」と呼ばれる2番目の信号グループがあります。これは特に意味がなく、複数の信号をキューに入れることもできます(通常の信号は、信号がブロックされると各信号の1つだけがキューに入れられます)。スレッド間通信のためにマルチスレッドプログラムで使用されます。たとえば、glibc の複数の POSIX スレッド実装があります。また、異なるプロセス間の通信にも使用できます(たとえば、複数のリアルタイム信号を使用して、fooctlプログラムにfooデーモンにメッセージを送信させることもできます)。
50,000フィート以外のビューについては、man 7 signal
カーネル内部ドキュメント(またはソースコード)を見てください。