再帰要求のシグナルはどうなりますか?

再帰要求のシグナルはどうなりますか?

プロセスが遅くなると、人々は仕事をキャンセルCtrl + cまたはCtrl + z放棄することがよくあります。この場合、これらの信号のどれを処理するか、最初一つまたは最後一つ?はい信号処理?そうでない場合はどれですか?無視される

答え1

受信機が次の信号が到着する前に信号処理を開始する時間がある場合、すべての信号が順次処理される。

プロセスがシグナルを受信したがそれを処理する準備ができていない場合(たとえば、シグナルがマスクされているかプロセスが停止した場合)、カーネルはシグナルを保留中としてマークします。信号が転送されます。

プロセスが準備されていない状態で異なる番号の複数の信号が受信されると、すべての信号が処理されます。信号はプロセスに 1 つずつ渡されます。彼らの配達順序は次のとおりです。POSIX が指定されていません。;存在するLinux、番号が付けられ、最小のものから渡されます(たとえば、保留中の場合はSIGHUP = 1が最初に渡され、次にSIGQUIT = 2など)。FreeBSDいかなる保証も行われません。

プロセスが準備されていない状態で同じ番号の複数の信号が受信されると、信号がマージされる可能性があります。 POSIXは何が起こるかを指定しませんが、ほとんどのユニークはマージされます。たとえば、を実行している場合、kill -1 234; kill -1 234プロセス234の信号1ハンドラが1回または2回受信されるかどうかは、234が最初の信号を転送するためのタイムスライスを取得するかどうかによるタイミングの問題です。

答え2

信号は端末を介して入力された順序でカーネルに送信されます。Ctrl+が使用されると、カーネルCはSIGINT信号をフォアグラウンドプロセスグループに送信するように指示されます。このメッセージを受信すると、実行中のコマンドが終了します。

+を使用してSIGSTP信号を送信しているCtrlことを示します。Zこれは実際にプロセスを終了するのではなく、一時的に停止するように指示するだけです。この機能を使用すると、プロセスをフォアグラウンドに戻すようにシェルに指示してプロセスを再開したり、コマンドを使用してfgバックグラウンドに配置したりできますbg

SIGSTP信号を介してジョブが停止した場合は、kill実際には次のコマンドを使用してジョブを終了できます。

$ kill %1

%1SIGSTPしたジョブのジョブIDはどこにありますか?

停止したジョブの確認

job次のように、次のコマンドを使用してシェルで停止した操作を確認できます。

$ sleep 1000 
^Z
[1]+  Stopped                 sleep 1000
$ jobs
[1]+  Stopped                 sleep 1000

Ctrlここでは、+を使用してコマンドを停止Zしますsleep 1000。上記の内容[1]に対応する出力です。%1このように殺すとCtrl+と同じ効果がありますC

$ kill %1
[1]+  Terminated              sleep 1000

fg上記とコマンドは、bg数字の後にプラス記号を付けた操作で機能します。+ここで出力を確認してくださいjobs

[1]+  Stopped                 sleep 1000

次のようなさまざまな仕事をしている場合は、より明確になります。

$ jobs
[1]   Stopped                 sleep 1000
[2]-  Stopped                 sleep 2000
[3]+  Stopped                 sleep 3000

したがって、すべての基本コマンドfgまたはbgコマンドは、+次のように特定のターゲットをターゲットにすることができます。

$ fg %1
sleep 1000

関連情報