Linux進(jìn)程通信 | 信號(hào)

一遂蛀、什么是信號(hào)真椿?

信號(hào)就像是一個(gè)突然的電話鈴聲鹃答,它會(huì)打斷正在進(jìn)行的程序并引起其注意。

在Linux系統(tǒng)中突硝,信號(hào)是一種軟件中斷测摔,它通常是異步發(fā)生的,可以用來(lái)通知進(jìn)程某個(gè)事件已經(jīng)發(fā)生解恰。锋八。每個(gè)信號(hào)都有一個(gè)唯一的編號(hào),編號(hào)從1開始护盈。進(jìn)程可以通過(guò)注冊(cè)信號(hào)處理函數(shù)來(lái)處理信號(hào)查库。

二、信號(hào)的分類

Linux系統(tǒng)中的信號(hào)有兩類:標(biāo)準(zhǔn)信號(hào)和實(shí)時(shí)信號(hào)黄琼。

  • 標(biāo)準(zhǔn)信號(hào)是傳統(tǒng)Unix系統(tǒng)中的信號(hào),編號(hào)范圍從1到31。

  • 實(shí)時(shí)信號(hào)是Linux獨(dú)有的信號(hào)脏款,編號(hào)范圍從32到64围苫。

三、信號(hào)的使用

1撤师、注冊(cè)信號(hào)處理函數(shù)

在C語(yǔ)言中剂府,可以使用signal函數(shù)來(lái)注冊(cè)信號(hào)處理函數(shù)。signal函數(shù)原型如下:

void (*signal(int signum, void (*handler)(int)))(int);

其中剃盾,signum參數(shù)表示要注冊(cè)的信號(hào)編號(hào)腺占,handler參數(shù)表示信號(hào)處理函數(shù)。signal函數(shù)會(huì)返回上一次注冊(cè)的信號(hào)處理函數(shù)的地址痒谴。

下面是一個(gè)簡(jiǎn)單的例子衰伯,注冊(cè)SIGINT信號(hào)的處理函數(shù):

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
 
void sigint_handler(int signo)
{
    printf("Received SIGINT signal!\n");
    exit(0);
}
 
int main()
{
    if (signal(SIGINT, sigint_handler) == SIG_ERR) {
        perror("signal");
        exit(1);
    }
 
    while (1) {
        printf("Hello World!\n");
        sleep(1);
    }
 
    return 0;
}

在上面的例子中,我們首先定義了一個(gè)名為sigint_handler的函數(shù)积蔚,用于處理SIGINT信號(hào)意鲸。

在main函數(shù)中,我們使用signal函數(shù)注冊(cè)了SIGINT信號(hào)的處理函數(shù)尽爆。如果signal函數(shù)返回的值是SIG_ERR怎顾,表示注冊(cè)信號(hào)處理函數(shù)失敗。

在循環(huán)中漱贱,我們只是簡(jiǎn)單地輸出Hello World槐雾!字符串,并使用sleep函數(shù)暫停1秒鐘幅狮,以便觀察信號(hào)處理過(guò)程募强。

  • 編譯并運(yùn)行,打印如下
[wayne@wayne:~]./signal
Hello World!
Hello World!
Hello World!

2彪笼、發(fā)送信號(hào)

2.1 kill函數(shù)

在Linux系統(tǒng)中钻注,可以使用kill函數(shù)向進(jìn)程發(fā)送信號(hào)。kill函數(shù)原型如下:

int kill(pid_t pid, int sig);

其中配猫,pid參數(shù)表示進(jìn)程的PID號(hào)幅恋,sig參數(shù)表示要發(fā)送的信號(hào)編號(hào)。如果pid參數(shù)的值是0泵肄,表示將信號(hào)發(fā)送給與當(dāng)前進(jìn)程屬于同一個(gè)進(jìn)程組的所有進(jìn)程捆交。

下面是一個(gè)例子,向指定進(jìn)程發(fā)送SIGINT信號(hào):

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv)
{
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
        exit(1);
    }

    pid_t pid = atoi(argv[1]);

    if (kill(pid, SIGINT) == -1) {
        perror("kill");
        exit(1);
    }

    return 0;
}

在上面的例子中腐巢,我們首先檢查命令行參數(shù)品追,如果參數(shù)不足,就打印使用說(shuō)明并退出程序冯丙。

然后我們將命令行參數(shù)轉(zhuǎn)換為進(jìn)程PID號(hào)肉瓦,并使用kill函數(shù)向該進(jìn)程發(fā)送SIGINT信號(hào)。如果kill函數(shù)返回-1,表示發(fā)送信號(hào)失敗泞莉。

  • 編譯并運(yùn)行哪雕,打印如下
[wayne@wayne:~] ps aux | grep signal
wayne     5902  0.0  0.0   2028   280 pts/25   S+   19:04   0:00 ./signal
wayne     5904  0.0  0.0   6108   852 pts/24   S+   19:04   0:00 grep --color=auto signal

[wayne@wayne:~] ./killsignal 5902


// 此時(shí)上面運(yùn)行的signal進(jìn)程會(huì)收到信號(hào),打印如下信息
Received SIGINT signal!

2.2 kill命令

我們也可以在shell中鲫趁,用kill命令向進(jìn)程發(fā)送信號(hào)斯嚎,kill命令的語(yǔ)法如下:

kill [options] <pid>

其中,pid表示要發(fā)送信號(hào)的進(jìn)程PID號(hào)挨厚。options是一些可選參數(shù)堡僻,例如,可以使用-9參數(shù)發(fā)送SIGKILL信號(hào)疫剃。

我們可以打開一個(gè)新的終端窗口钉疫,使用ps命令查看本文介紹的示例程序的PID號(hào),然后使用kill命令向該進(jìn)程發(fā)送SIGINT信號(hào)慌申,示例如下:

$ ps aux | grep signal
wayne     5902  0.0  0.0   2028   280 pts/25   S+   19:04   0:00 ./signal
wayne     5904  0.0  0.0   6108   852 pts/24   S+   19:04   0:00 grep --color=auto signal

$ kill -2 5902

這里我們使用ps命令查找名為signal的進(jìn)程的PID號(hào)為5902陌选,然后使用kill命令向該進(jìn)程發(fā)送SIGINT信號(hào)(信號(hào)編號(hào)為2)。在執(zhí)行kill命令之后蹄溉,我們可以看到示例程序輸出了"Received SIGINT signal"這一行信息咨油,說(shuō)明信號(hào)處理函數(shù)已經(jīng)被正確調(diào)用了。

四柒爵、常用信號(hào)

Linux系統(tǒng)中常用的信號(hào)有很多役电,下面列出一些常用的信號(hào)及其含義:

信號(hào)編號(hào) 信號(hào)名稱 含義
1 SIGHUP 終端掛起或者控制進(jìn)程結(jié)束
2 SIGINT 中斷信號(hào),通常是CTRL-C
3 SIGQUIT 終止信號(hào)棉胀,通常是CTRL-\
9 SIGKILL 強(qiáng)制終止進(jìn)程
11 SIGSEGV 段錯(cuò)誤
15 SIGTERM 終止信號(hào)法瑟,通常是kill命令發(fā)送的信號(hào)
18 SIGCONT 繼續(xù)執(zhí)行被暫停的進(jìn)程
19 SIGSTOP 暫停進(jìn)程
20 SIGTSTP 終端掛起或者CTRL-Z

五、小結(jié)

總的來(lái)說(shuō)唁奢,Linux 信號(hào)是一種用于通知進(jìn)程發(fā)生某個(gè)事件或錯(cuò)誤的機(jī)制霎挟,可以用于處理異常情況、進(jìn)程間通信等多種場(chǎng)景麻掸。

以上酥夭,如果覺得對(duì)你有幫助,點(diǎn)個(gè)贊再走吧脊奋,這樣@知微之見也有更新下去的動(dòng)力熬北!

也歡迎私信我,一起交流诚隙!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讶隐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子久又,更是在濱河造成了極大的恐慌巫延,老刑警劉巖效五,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烈评,居然都是意外死亡火俄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門讲冠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人适瓦,你說(shuō)我怎么就攤上這事竿开。” “怎么了玻熙?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵否彩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嗦随,道長(zhǎng)列荔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任枚尼,我火速辦了婚禮贴浙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘署恍。我一直安慰自己崎溃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布盯质。 她就那樣靜靜地躺著袁串,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呼巷。 梳的紋絲不亂的頭發(fā)上囱修,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音王悍,去河邊找鬼破镰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛配名,可吹牛的內(nèi)容都是我干的啤咽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渠脉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宇整!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芋膘,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鳞青,失蹤者是張志新(化名)和其女友劉穎霸饲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臂拓,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厚脉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胶惰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻工。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖孵滞,靈堂內(nèi)的尸體忽然破棺而出中捆,到底是詐尸還是另有隱情,我是刑警寧澤坊饶,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布泄伪,位于F島的核電站,受9級(jí)特大地震影響匿级,放射性物質(zhì)發(fā)生泄漏蟋滴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一痘绎、第九天 我趴在偏房一處隱蔽的房頂上張望津函。 院中可真熱鬧,春花似錦简逮、人聲如沸球散。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蕉堰。三九已至,卻和暖如春悲龟,著一層夾襖步出監(jiān)牢的瞬間屋讶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工须教, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皿渗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓轻腺,卻偏偏與公主長(zhǎng)得像乐疆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贬养,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容