Unix進程通信:信號

信號原理

  • 信號機制:事件促使內(nèi)核向進程發(fā)送信號
  • 事件類型:
    • 鍵盤按鍵請求內(nèi)核產(chǎn)生信號:ctrl+c锻狗、ctrl+/等
    • 進程執(zhí)行出錯時掌腰,如越界訪問狰住,0做除數(shù),整形溢出齿梁。內(nèi)核給進程發(fā)信號
    • 一個進程調(diào)用kill給另一個進程發(fā)信號催植。
  • 信號機制過程
    信號未決(信號處理之前的狀態(tài)):事件產(chǎn)生->內(nèi)核發(fā)送信號給指定進程->信號注冊(信號進PCB)
    信號遞送(信號處理動作):信號被屏蔽/若未被屏蔽肮蛹,信號從PCB注銷->信號處理
  • 信號處理方式
    • 按默認方式處理:man 7 signal可以查看每個信號的默認處理方式
    • 忽略信號,SIGKILL和SIGSTOP不能被忽略
    • 捕捉信號创南,作出反應(yīng)
  • 可用于進程間使用信號通信
  • 異步通信機制(約定信號處理機制)
  • shell中用 kill -l 查看信號


  • 信號分類
    • 小于32號為不可靠信號伦忠,不支持信號隊列。后面為可靠信號稿辙,支持信號隊列
    • 同步信號:本進程操作產(chǎn)生的信號昆码。異步信號:進程之外的事件引發(fā)的信號。
  • 信號的意義見官方信號表
    http://man7.org/linux/man-pages/man7/signal.7.html
    也可在終端輸入man 7 signal查看信號詳細信息和默認處理方式

信號處理函數(shù)API

include <signal.h>
__sighandler_t signal(int signum,__sighandler_t handler)

參數(shù)表:
signum:要處理的信號
handler:信號處理函數(shù)

  • __sighandler_t的定義:typedef void (*__sighandler_t)(int);
    函數(shù)指針:返回值為void邻储,有一個類型為int的參數(shù)
    此參數(shù)對應(yīng)三種不同的應(yīng)對
    • SIG_IGN:忽略
    • SIG_DFL:默認
    • 函數(shù)名:用戶自己定義的反應(yīng)函數(shù)

返回值:
不為-1:成功
SIG_ERR:出錯
示例代碼:

#include <signal.h>
#include <stdlib.h>//perror,exit()
#include <unistd.h>//fork(),pause()
#include <sys/wait.h>//wait()
#include <iostream>
using namespace std;
 
void fun(int signal)
{
    cout << "process:"<<getpid()<<"have captured the signal " << endl;
}

int  main()
{
    int pid;
    if( ( pid = fork() ) == -1 )
    {
        perror("fork");
        exit(1);    
    }       

    else if(pid == 0)//son process
    {
        signal(SIGINT,fun);
        //SIGINT:signal from keyboard
        //約定信號處理函數(shù)
        
        cout << "waiting for signal" << endl;       
        pause();//掛起等待信號
    }
    else//parent process
    {
        sleep(1);
        kill(pid,SIGINT);//發(fā)送信號
        wait(NULL);
    }
}

也可發(fā)送信號10(用戶自定義信號)來進行進程通信

signal函數(shù)存在的問題

  • 信號處理不可靠
    處理結(jié)束后需要再次設(shè)置監(jiān)聽赋咽,所以常用此結(jié)構(gòu)
    void handler(int signo)
    {
      signal(SIGINT,handler);
    ...
    }
    
    這種結(jié)構(gòu)在相應(yīng)處理完信號到重設(shè)監(jiān)聽狀態(tài)有一段危險時間(雖然很短)
  • 不方便獲取當(dāng)前信號處理方式
  • 無法處理多個信號--無法阻塞信號

其他信號相關(guān)api(待更新)

  • sigaction:
    int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
    • 當(dāng)act為空,oldact非空:獲取signum當(dāng)前的處理方式
    • 當(dāng)act非空吨娜,oldact為空:安裝信號處理函數(shù)
    • sigaction結(jié)構(gòu)體
struct sigaction {
    void (*sa_handler)(int);//信號處理函數(shù)句柄脓匿,不帶參數(shù)
    void (*sa_sigaction)(int, siginfo_t *, void *);//信號處理函數(shù)句柄,帶參數(shù)
    sigset_t sa_mask;//響應(yīng)信號:哪些信號可以阻塞等待執(zhí)行
    int sa_flags;//設(shè)置是否在信號響應(yīng)后恢復(fù)對信號的默認處理
    void (*sa_restorer)(void);
}

一個小例子
通過argv來傳送pid和signum
發(fā)送端

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

void main(int argc,char**argv)
{
        pid_t pid;
        pid=(pid_t)atoi(argv[1]);
        int signum;
    signum = atoi(argv[2]);
        union sigval mysigval;
        if(kill(pid,signum)==-1)
                printf("send error\n");
        sleep(2);
}

接收端

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>//atoi
void new_op(int signum)
{
        printf("recieve signumm %d\n",signum);
}

int main(int argc,char**argv)
{
        struct sigaction act;
        sigemptyset(&act.sa_mask);
        act.sa_handler=new_op;
        act.sa_flags=SA_RESETHAND;
        if(sigaction(30,&act,NULL)<0)
        {
                printf("install sigal error\n");
        }
        pid_t pid;         
        pid=getpid();
    printf("pid : %d\n",pid);
    sleep(10);
}
image.png
  • kill:發(fā)送信號
  • raise:給自己發(fā)信號
  • alarm:計時器
  • pause:掛起(等信號)(pause+alarm = sleep):
  • sigqueue:可以在發(fā)信號的時候傳參
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宦赠,一起剝皮案震驚了整個濱河市亦镶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袱瓮,老刑警劉巖缤骨,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尺借,居然都是意外死亡绊起,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門燎斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱歪,“玉大人,你說我怎么就攤上這事栅表∷癖桑” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵怪瓶,是天一觀的道長萧落。 經(jīng)常有香客問我,道長洗贰,這世上最難降的妖魔是什么找岖? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮敛滋,結(jié)果婚禮上许布,老公的妹妹穿的比我還像新娘奈惑。我一直安慰自己粮彤,他們只是感情好波附,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布诈火。 她就那樣靜靜地躺著,像睡著了一般袁余。 火紅的嫁衣襯著肌膚如雪擎勘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天泌霍,我揣著相機與錄音货抄,去河邊找鬼述召。 笑死朱转,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的积暖。 我是一名探鬼主播藤为,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夺刑!你這毒婦竟也來了缅疟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤遍愿,失蹤者是張志新(化名)和其女友劉穎存淫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼填,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡桅咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坞笙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岩饼。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖薛夜,靈堂內(nèi)的尸體忽然破棺而出籍茧,到底是詐尸還是另有隱情,我是刑警寧澤梯澜,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布寞冯,位于F島的核電站,受9級特大地震影響晚伙,放射性物質(zhì)發(fā)生泄漏简十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一撬腾、第九天 我趴在偏房一處隱蔽的房頂上張望螟蝙。 院中可真熱鬧,春花似錦民傻、人聲如沸胰默。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牵署。三九已至漏隐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奴迅,已是汗流浹背青责。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取具,地道東北人脖隶。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像暇检,于是被迫代替她去往敵國和親产阱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 進程之間可以通過信號傳遞信息块仆,信號是一種軟中斷機制构蹬,通過信號用來通知進程發(fā)生了異步事件。進程之間可以互相通過系統(tǒng)調(diào)...
    lintong閱讀 409評論 0 2
  • 概述 Linux 在進程間通信時,有時候需要用到異步通訊方式,而信號機制是Linux系統(tǒng)本身提供的一種異步通訊. ...
    大風(fēng)qixi閱讀 1,894評論 0 4
  • 對于 Linux來說悔据,實際信號是軟中斷庄敛,許多重要的程序都需要處理信號。信號科汗,為 Linux 提供了一種處理異步事件...
    故事狗閱讀 84,789評論 2 62
  • 使用場景:1藻烤、為了并發(fā),中斷處理其它事件肛捍,1隐绵、進程間通信1、中斷中止(注意不是終止)當(dāng)前正在執(zhí)行的程序拙毫,轉(zhuǎn)而執(zhí)行其...
    奧斯特洛司機閱讀 688評論 0 0
  • 讀完梁校的《擁抱夢想缀蹄,心向光明遠方》峭跳,印象特別深刻的是,最好的投資是投資一個人的思想缺前,改變一個人的價值取向蛀醉,思想都...
    prettycool閱讀 278評論 0 0