Linux 兩組信號對比

博客逐步遷移到,獨立博客,原文地址 http://www.woniubi.cn/two_groups_signal_difference/ui

以前看信號的時候,沒有太注意不一樣信號的對比.今天再次看到的時候,忽然感受對一些信號,很是類似,乃至很是容易混淆.今天週末就抽空總結一下.spa

第一組 關閉進程信號

常見的4中關閉進程信號是SIGKILL,SIGINT,SIGTERM,SIGQUIT.orm

  1. SIGKILL,就是爲了關閉進程用的,沒法捕獲以及忽略.場景是,管理員把一些佔用資源的進程或者沒法掌控的孤兒進程殺死.
  2. SIGINT,interrupt(中斷)進程,這個是能夠捕獲以及忽略。可使用ctrl+c發出信號,直接發給父進程以及子進程,這樣的話就能夠把這個程序全部的進程均可以關閉掉。
  3. SIGTERM,terminate(終止)進程,這個也是能夠捕獲以及忽略的。和SIGINT相比,就是沒有相應的鍵盤控制命令。若是要去關閉全部的進程的話,只能挨個的發給全部的進程。
  4. SIGQUIT,quit(退出)進程,這個也是能夠捕獲以及忽略的。可使用ctrl+\發出信號,直接發給父進程以及子進程。若是是不捕獲的話,他就會產生core文件。
信號 是否能夠被捕獲 鍵盤快捷鍵 是否產生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

sigint

能夠看到輸入ctrl+c的時候,父子進程都收到相關的信號。可是我輸入kill -2 742的時候,只有父進程收到了,不會傳給子進程。 資源

下面咱們驗證SIGQUIT產生core。get

sigquit

可能部分的機器默認是不產生,咱們須要輸入幾個命令。博客


#設置core文件大小,這裏是無限制
ulimit -c unlimited 
#core後面跟着pid
sudo sysctl kernel.core_uses_pid=1
#core文件存放路徑,放在當前的文件夾下
sudo sysctl kernal.core_pattern=core

第二組 中止信號

這組信號對比,相對上一組就簡單多了.

  1. SIGSTOP,程序掛起,沒有相應的快捷鍵,不能被捕獲以及忽略。
  2. SIGTSTP,程序掛起,快捷鍵ctrl+z,能夠被捕獲以及忽略。

若是掛起以後,怎麼再次讓他們啓動呢。簡單一點,咱們能夠輸入jobs,而後看一下他們的索引值。而後fg啓動他們。


sigtstp

咱們也能夠給他們發送SIGCONT信號,讓他們啓動起來。不過這個時候,他們的只能在後臺運行了。


sigcton

這個時候,就能夠看到他們的狀態從T變成了S,從中止變成了運行狀態。

相關文章
相關標籤/搜索