[c/c++] 7.signal函數(shù)

函數(shù)signal

UNIX系統(tǒng)信號(hào)機(jī)制最簡(jiǎn)單的接口是signal函數(shù)。

#include <signal.h>
    void (*signal(int signo, void (*func)(int)))(int);

返回值:若成功,返回以前的信號(hào)處理配置;若出錯(cuò),返回SIG_ERR

signal函數(shù)由ISO C定義。因?yàn)镮SO C不涉及多進(jìn)程、進(jìn)程組以及終 端I/O等,所以它對(duì)信號(hào)的定義非常含糊,以致于對(duì)UNIX系統(tǒng)而言幾乎 毫無(wú)用處。
從UNIX System V派生的實(shí)現(xiàn)支持signal函數(shù),但該函數(shù)提供舊的 不可靠信號(hào)語(yǔ)義(10.4節(jié)將說(shuō)明這些舊的語(yǔ)義)。提供此函數(shù)主要是為 了向后兼容要求此舊語(yǔ)義的應(yīng)用程序,新應(yīng)用程序不應(yīng)使用這些不可靠 信號(hào)。
4.4BSD 也提供 signal 函數(shù),但它是按照 sigaction 函數(shù)定義
所以在 4.4BSD 之下使用它提供 新的可靠信號(hào)語(yǔ)義。目前大多數(shù)系統(tǒng)遵循這種策略,但Solaris 10沿用 System V signal函數(shù)的語(yǔ)義。

signo參數(shù)是圖10-1中的信號(hào)名。func的值是常量SIG_IGN、常量 SIG_DFL或當(dāng)接到此信號(hào)后要調(diào)用的函數(shù)的地址。如果指定SIG_IGN, 則向內(nèi)核表示忽略此信號(hào)(記住有兩個(gè)信號(hào)SIGKILL和SIGSTOP不能忽略

當(dāng)指定函數(shù)地址時(shí),則在信號(hào)發(fā)生時(shí),調(diào) 用該函數(shù),我們稱這種處理為捕捉該信號(hào),稱此函數(shù)為信號(hào)處理程序 (signal handler)或信號(hào)捕捉函數(shù)(signal-catching function)。

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

void add(int x) {
    std::cout << "use signal slover" << std::endl;
    exit(0);
}

int main() {

    /*----------------------------------- test signal ----------------------------------------*/
    void (*f)(int x) = add;
    signal(SIGINT, f);

    for (int i = 0; i < 10; ++i) {
        std::cout << "hello" << std::endl;
        sleep(1);
    }

    return 0;
}

我們可以捕捉信號(hào)進(jìn)行處理,或者忽略信號(hào)
捕捉信號(hào)SIGTSTP

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

void add(int x) {
    std::cout << "use signal slover" << std::endl;
    std::cout << "catch SIGTSTP" << std::endl;
    exit(0);
}

int main() {

    /*----------------------------------- test signal ----------------------------------------*/
    void (*f)(int x) = add;
    signal(SIGTSTP, f);

    for (int i = 0; i < 10; ++i) {
        std::cout << "hello" << std::endl;
        sleep(1);
    }

    return 0;
}

運(yùn)行時(shí)像進(jìn)程kill -TSTP pid或者輸入ctrl + z即可捕捉到

或者忽略指定信號(hào)(SIGKILL 和SIGSTOP不能忽略)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、信號(hào)及信號(hào)來(lái)源 信號(hào)本質(zhì) 信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一...
    丶Em1tu0F閱讀 1,511評(píng)論 0 1
  • 信號(hào)Signal 信號(hào)Signal的全稱為軟中斷信號(hào),是用來(lái)通知進(jìn)程發(fā)生了異步事件,是在軟件層次上對(duì)中斷機(jī)制的一種...
    JunChow520閱讀 31,174評(píng)論 0 2
  • 8.5 信號(hào) 研究一種更高層次的軟件形式的異常, 也是一種軟件中斷,稱為Unix信號(hào),它允許進(jìn)程中斷其他進(jìn)程。 一...
    ShawnPanCn閱讀 964評(píng)論 0 0
  • 轉(zhuǎn)自:http://www.dbafree.net/?p=870 我們可以使用kill -l查看所有的信號(hào)量解釋,...
    AndreaArlex閱讀 6,318評(píng)論 0 4
  • Linux進(jìn)程間通信的概念 linux下進(jìn)程間通信的幾種主要手段簡(jiǎn)介: 管道(Pipe)及有名管道(named p...
    wewarriors閱讀 1,011評(píng)論 0 6

友情鏈接更多精彩內(nèi)容