SIGTERMは、シグナルハンドラがないとSIGKILLと同じように動作しますか?

SIGTERMは、シグナルハンドラがないとSIGKILLと同じように動作しますか?

SIGTERMとSIGKILLのほとんどの説明はSIGKILLを指します。

SIGTERM や SIGINT とは異なり、[...] はキャプチャまたは無視できません。 [...](ウィキペディア)

これがSIGTERMとSIGKILLの唯一の違いですか?特に、プロセスにSIGTERMハンドラがインストールされていない場合、SIGTERMまたはSIGKILLをプロセスに送信することに違いはありますか?

答え1

信号構成がない場合、およびSIGTERMSIGKILL含む基本的な動作は、プロセスを終了する他の信号と同様に、少なくともプロセスが終了するという点で実質的に同じです。 〜のようにSIGUSR1SIGUSR2イルカチョ親プロセスが子プロセスを終了する信号について通知することを指摘しています。 (これはシェルが信号を区別して印刷する方法です。例えば「終了」v。 「ユーザー定義シグナル1」)。

ウィキペディアで述べたように、SIGKILL返されるか無視することはできません。つまり、SIGTERMプロセスが無効になるためにハンドラをインストールする必要はなく、SIGTERM単にブロックまたは無視することができます。sighold()sigrelse()sigignore())。

POSIXの詳細信号処理の基本原理。 Linuxsignal(7)シグナルはマンページにも詳しく説明されています。

答え2

これがSIGTERMとSIGKILLの唯一の違いですか?

いいえ。

SIGKILLaとuncaughtの大きな違いは、SIGTERM前者も同様です。目覚めるでのみ使用できる停止されたプロセス(即時自己消滅可能)ですSIGCONT

簡単な例:

$ sleep 1000 & sleep 1; kill -TSTP $!
[1] 6455

[1]+  Stopped                 sleep 1000
$ kill -TERM 6455
$ jobs
[1]+  Stopped                 sleep 1000
$ kill -CONT 6455
$ jobs
[1]+  Terminated              sleep 1000

TERM、、、HUPなどINTの信号が有効であることを確認するには、CONT順序に関係なく信号とペアを設定する必要があります。

bash組み込みの魔法のため、人々はこれを簡単に理解できないかもしれません。または(または不正なpid)killなどのジョブIDと組み合わせて使用​​すると、停止したプロセスを示します。%%1働く、そうです自分でやろうカーテンの後ろ:

/* Give PID SIGNAL.  This determines what job the pid belongs to (if any).
   If PID does belong to a job, and the job is stopped, then CONTinue the
   job after giving it SIGNAL.  Returns -1 on failure.  If GROUP is non-null,
   then kill the process group associated with PID. */
int
kill_pid (pid, sig, group)

関連情報