博客逐步遷移到,獨立博客,原文地址http://www.woniubi.cn/two_groups_signal_difference/
之前看信號的時候,沒有太注意不同信號的對比.今天再次看到的時候,突然感覺對一些信號,非常相似,乃至非常容易混淆.今天周末就抽空總結一下.
第一組 關閉進程信號常見的4中關閉進程信號是SIGKILL,SIGINT,SIGTERM,SIGQUIT.
| 信號 | 是否可以被捕獲 | 鍵盤快捷鍵 | 是否產生core文件 |
| SIGKILL | 否 | ||
| SIGINT | 是 | ctrl+c | |
| SIGTERM | 是 | ||
| SIGQUIT | 是 | ctrl+/ | 是 |
鍵盤快捷鍵最大的好處就是發給所有的進程。
最下面我們用程序來驗證一下。
第一組 關閉進程信號 程序驗證先上代碼。
#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。

可以看到輸入ctrl+c的時候,父子進程都收到相關的信號。但是我輸入kill -2 742的時候,只有父進程收到了,不會傳給子進程。
下面我們驗證SIGQUIT產生core。

可能部分的機器默認是不產生,我們需要輸入幾個命令。
#設置core文件大小,這里是無限制ulimit -c unlimited #core后面跟著pidsudo sysctl kernel.core_uses_pid=1#core文件存放路徑,放在當前的文件夾下sudo sysctl kernal.core_pattern=core第二組 停止信號
這組信號對比,相對上一組就簡單多了.
如果掛起之后,怎么再次讓他們啟動呢。簡單一點,我們可以輸入jobs,然后看一下他們的索引值。然后fg啟動他們。
我們也可以給他們發送SIGCONT信號,讓他們啟動起來。不過這個時候,他們的只能在后臺運行了。
這個時候,就可以看到他們的狀態從T變成了S,從停止變成了運行狀態。
新聞熱點
疑難解答