国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux 兩組信號對比

2024-06-28 13:20:35
字體:
來源:轉載
供稿:網友
linux 兩組信號對比

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

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

第一組 關閉進程信號

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

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

鍵盤快捷鍵最大的好處就是發給所有的進程。

最下面我們用程序來驗證一下。

第一組 關閉進程信號 程序驗證

先上代碼。

#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。

sigint

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

下面我們驗證SIGQUIT產生core。

sigquit

可能部分的機器默認是不產生,我們需要輸入幾個命令。

#設置core文件大小,這里是無限制ulimit -c unlimited #core后面跟著pidsudo 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,從停止變成了運行狀態。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 温宿县| 白河县| 莒南县| 元朗区| 正定县| 色达县| 昌江| 浙江省| 乌兰县| 仪陇县| 河津市| 全州县| 麦盖提县| 墨脱县| 灵台县| 临城县| 壶关县| 宁海县| 丰镇市| 隆昌县| 会泽县| 哈巴河县| 南开区| 洛宁县| 阜新| 开化县| 白朗县| 卢龙县| 荣成市| 崇阳县| 繁峙县| 广昌县| 鹰潭市| 汕头市| 益阳市| 石棉县| 农安县| 阳江市| 德格县| 行唐县| 德江县|