歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 兩組信號對比

之前看信號的時候,沒有太注意不同信號的對比.今天再次看到的時候,突然感覺對一些信號,非常相似,乃至非常容易混淆.今天周末就抽空總結一下.

第一組 關閉進程信號

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

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

sudo sysctl kernel.core_uses_pid=1

#core文件存放路徑,放在當前的文件夾下

sudo sysctl kernal.core_pattern=core

第二組 停止信號

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

SIGSTOP,程序掛起,沒有相應的快捷鍵,不能被捕獲以及忽略。

SIGTSTP,程序掛起,快捷鍵ctrl+z,可以被捕獲以及忽略。

如果掛起之後,怎麼再次讓他們啟動呢。簡單一點,我們可以輸入jobs,然後看一下他們的索引值。然後fg啟動他們。

我們也可以給他們發送SIGCONT信號,讓他們啟動起來。不過這個時候,他們的只能在後台運行了。

這個時候,就可以看到他們的狀態從T變成了S,從停止變成了運行狀態。

Copyright © Linux教程網 All Rights Reserved