之前看信號的時候,沒有太注意不同信號的對比.今天再次看到的時候,突然感覺對一些信號,非常相似,乃至非常容易混淆.今天周末就抽空總結一下.
第一組 關閉進程信號
常見的4中關閉進程信號是SIGKILL,SIGINT,SIGTERM,SIGQUIT.
鍵盤快捷鍵最大的好處就是發給所有的進程。
最下面我們用程序來驗證一下。
第一組 關閉進程信號 程序驗證
先上代碼。
#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後面跟著pid
sudo sysctl kernel.core_uses_pid=1
#core文件存放路徑,放在當前的文件夾下
sudo sysctl kernal.core_pattern=core
第二組 停止信號
這組信號對比,相對上一組就簡單多了.
SIGSTOP,程序掛起,沒有相應的快捷鍵,不能被捕獲以及忽略。
SIGTSTP,程序掛起,快捷鍵ctrl+z,可以被捕獲以及忽略。
如果掛起之後,怎麼再次讓他們啟動呢。簡單一點,我們可以輸入jobs,然後看一下他們的索引值。然後fg啟動他們。
我們也可以給他們發送SIGCONT信號,讓他們啟動起來。不過這個時候,他們的只能在後台運行了。
這個時候,就可以看到他們的狀態從T變成了S,從停止變成了運行狀態。