淺嘗輒止7-Linux基礎-信號

信號是Linux系統(tǒng)提供的另一種進程通信機制同眯。

手冊

手冊 功能簡介
signal(7) 信號概述
signal(2) 設置信號處理函數(shù)
kill(2) 發(fā)送信號的函數(shù)
kill(1) 發(fā)送信號的命令
raise(3) 向當前進程發(fā)送信號

信號

顧名思義绽昼,可以發(fā)信號,它不叫數(shù)據(jù)嗽测,也就是說绪励,數(shù)據(jù)量很少,類似于脈沖唠粥。不過“脈沖”的種類很多,在signal(7)中可以看到停做,信號有很多種晤愧,比如常用的ctrl+c就是向前臺進程發(fā)送一個SIGINT信號,SIGKILL是殺進程的信號蛉腌。

信號處理函數(shù)

每個進程對于每個信號都有一個信號處理函數(shù)官份,當進程收到信號時只厘,信號處理函數(shù)會被調用,默認的信號處理函數(shù)會殺死當前進程舅巷,如果要在某種信號下做一些自定義處理羔味,可以用signal(2)設置自定義的信號處理函數(shù)。系統(tǒng)提供了兩個現(xiàn)成的信號處理函數(shù)钠右,SIG_IGN是忽略信號赋元,SIG_DFL是默認信號處理函數(shù)。

代碼演示

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>

static int stage = 0;//表示演示階段飒房,共有3個演示

//自定義信號處理函數(shù)
static void sighandler(int sig){
    printf("%d receive signal %d\n", getpid(), sig);
    stage++;
    if (stage > 2){//三個演示完成后結束進程
        _exit(0);
    }
}

int main(int argc, char **argv)
{
    pid_t pid = fork();
    if (pid > 0){
        //父進程搁凸,發(fā)送信號
        sleep(1);//等子進程設定好信號處理函數(shù)
        printf("%d send signal %d to %d\n", getpid(), SIGINT, pid);
        kill(pid, SIGINT);//向子進程發(fā)送一個ctrl+c信號
        waitpid(pid,NULL,0);
    }
    else if (pid == 0){
        //子進程
        signal(SIGINT, sighandler);//為ctrl+c設定信號處理函數(shù)
        while (stage < 1);//等待信號處理函數(shù)完成
        printf("%d send signal %d to %d\n", getpid(), SIGINT, getpid());
        raise(SIGINT);//向自己進程發(fā)送ctrl+c信號
        while (stage < 2);//等待信號處理函數(shù)完成
        printf("Please use \"kill -2 %d\"\n", getpid());
        while (stage < 3);//等待用戶用kill命令發(fā)送信號
    }
    return 0;
}

運行與輸出

# gcc test.c -o test && ./test &
[1] 82086
82096 send signal 2 to 82097
82097 receive signal 2
82097 send signal 2 to 82097
82097 receive signal 2
Please use "kill -2 82097"

# kill -2 82097
82097 receive signal 2
[1]+  Done                    gcc test.c -o test && ./test

第一個演示是主進程發(fā)送信號給子進程,所以82096是主進程狠毯,82097是子進程护糖。信號的值為2,即SIGINT嚼松。
第二個演示是嫡良,子進程自己發(fā)信號給自己,觸發(fā)了自己的信號處理函數(shù)献酗。
第三個演示是寝受,用戶用kill命令主動向子進程發(fā)信號,最后子進程也收到了凌摄。

信號組可以去了解一下羡蛾。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锨亏,隨后出現(xiàn)的幾起案子痴怨,更是在濱河造成了極大的恐慌,老刑警劉巖器予,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪藻,死亡現(xiàn)場離奇詭異,居然都是意外死亡乾翔,警方通過查閱死者的電腦和手機爱葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來反浓,“玉大人萌丈,你說我怎么就攤上這事±自颍” “怎么了辆雾?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長月劈。 經常有香客問我度迂,道長藤乙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任惭墓,我火速辦了婚禮坛梁,結果婚禮上,老公的妹妹穿的比我還像新娘腊凶。我一直安慰自己划咐,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布吭狡。 她就那樣靜靜地躺著尖殃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪划煮。 梳的紋絲不亂的頭發(fā)上送丰,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音弛秋,去河邊找鬼器躏。 笑死,一個胖子當著我的面吹牛蟹略,可吹牛的內容都是我干的登失。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挖炬,長吁一口氣:“原來是場噩夢啊……” “哼揽浙!你這毒婦竟也來了?” 一聲冷哼從身側響起意敛,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤馅巷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后草姻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钓猬,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年撩独,在試婚紗的時候發(fā)現(xiàn)自己被綠了敞曹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡综膀,死狀恐怖澳迫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情剧劝,我是刑警寧澤纲刀,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站担平,受9級特大地震影響示绊,放射性物質發(fā)生泄漏。R本人自食惡果不足惜暂论,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一面褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧取胎,春花似錦展哭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至觉痛,卻和暖如春役衡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薪棒。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工手蝎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俐芯。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓棵介,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吧史。 傳聞我的和親對象是個殘疾皇子邮辽,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容