博客逐步遷移到,獨立博客,原文地址 http://www.woniubi.cn/two_groups_signal_difference/ui
以前看信號的時候,沒有太注意不一樣信號的對比.今天再次看到的時候,忽然感受對一些信號,很是類似,乃至很是容易混淆.今天週末就抽空總結一下.spa
常見的4中關閉進程信號是SIGKILL,SIGINT,SIGTERM,SIGQUIT.orm
信號 | 是否能夠被捕獲 | 鍵盤快捷鍵 | 是否產生core文件 |
SIGKILL |
否 | |
|
SIGINT |
是 | ctrl+c | |
SIGTERM |
是 |
|
|
SIGQUIT |
是 |
ctrl+\ | 是 |
鍵盤快捷鍵最大的好處就是發給全部的進程。 blog
最下面咱們用程序來驗證一下。 索引
先上代碼。 進程
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void process(int signo){ printf("signo:%d,pid:%d\n",signo,getpid()); } void cleanup(){ printf("cleanup,pid:%d\n",getpid()); } int main() { pid_t pid; atexit(cleanup); signal(SIGINT, process); signal(SIGTERM, process); //signal(SIGQUIT, process); if( (pid = fork()) == 0 ) { printf("child pid:%d\n",getpid()); while(1){ sleep(1); } }else{ printf("parent pid:%d\n",getpid()); while(1){ sleep(1); } } return 0; }
SIGKILL比較簡單,咱們就再也不驗證了。先驗證一下SIGINT。ci
能夠看到輸入ctrl+c的時候,父子進程都收到相關的信號。可是我輸入kill -2 742的時候,只有父進程收到了,不會傳給子進程。 資源
下面咱們驗證SIGQUIT產生core。get
可能部分的機器默認是不產生,咱們須要輸入幾個命令。博客
#設置core文件大小,這裏是無限制 ulimit -c unlimited #core後面跟着pid sudo sysctl kernel.core_uses_pid=1 #core文件存放路徑,放在當前的文件夾下 sudo sysctl kernal.core_pattern=core
這組信號對比,相對上一組就簡單多了.
若是掛起以後,怎麼再次讓他們啓動呢。簡單一點,咱們能夠輸入jobs,而後看一下他們的索引值。而後fg啓動他們。
咱們也能夠給他們發送SIGCONT信號,讓他們啓動起來。不過這個時候,他們的只能在後臺運行了。
這個時候,就能夠看到他們的狀態從T變成了S,從中止變成了運行狀態。