信號(hào)處理

2018-08-12 22:03 更新

信號(hào)處理

信號(hào)是由操作系統(tǒng)傳遞到進(jìn)程的中斷,它可以提前終止一個(gè)程序。在 UNIX,LINUX,Mac OS X 或 Windows 系統(tǒng)上,你可以通過(guò)按 Ctrl+C 產(chǎn)生一個(gè)中斷。

有的信號(hào)不能被程序捕獲到,但是下面列出的信號(hào),你可以在程序中捕捉它們,并且可以基于這些信號(hào)進(jìn)行相應(yīng)的操作。這些信號(hào)定義在 C++ 頭文件<csignal>中。

信號(hào) 描述
SIGABRT 程序的異常終止,例如調(diào)用 abort
SIGFPE 一個(gè)錯(cuò)誤的算術(shù)運(yùn)算,例如除以零或運(yùn)算結(jié)果溢出。
SIGILL 檢測(cè)到非法指令。
SIGINT 接收到交互注意信號(hào)。
SIGSEGV 一個(gè)非法的存儲(chǔ)訪問(wèn)。
SIGTERM 發(fā)送給程序的終止請(qǐng)求信號(hào)。

signal() 函數(shù)

C++ 信號(hào)處理庫(kù)提供 signal 函數(shù)來(lái)捕獲意外事件。以下是 signal() 函數(shù)的語(yǔ)法:

    void (*signal (int sig, void (*func)(int)))(int); 

簡(jiǎn)單來(lái)說(shuō),這個(gè)函數(shù)接收兩個(gè)參數(shù):第一個(gè)參數(shù)是一個(gè)整數(shù),表示信號(hào)號(hào)碼;第二個(gè)參數(shù)是一個(gè)指向信號(hào)處理函數(shù)的指針。

讓我們用 signal() 函數(shù)寫(xiě)一個(gè)簡(jiǎn)單的 C++ 程序,用它來(lái)捕捉 SIGINT 信號(hào)。不管你想在程序中捕獲什么信號(hào),你必須使用 signal 函數(shù)注冊(cè)該信號(hào),并將其與信號(hào)處理程序相關(guān)聯(lián)。 例子如下所示:

    #include <iostream>
    #include <csignal>

    using namespace std;

    void signalHandler( int signum )
    {
    cout << "Interrupt signal (" << signum << ") received.\n";

    // cleanup and close up stuff here  
    // terminate program  

       exit(signum);  

    }

    int main ()
    {
    // register signal SIGINT and signal handler  
    signal(SIGINT, signalHandler);  

    while(1){
       cout << "Going to sleep...." << endl;
       sleep(1);
    }

    return 0;
    }

當(dāng)上述代碼編譯和執(zhí)行后,將會(huì)產(chǎn)生以下的結(jié)果:

    Going to sleep....
    Going to sleep....
    Going to sleep....

現(xiàn)在,按 Ctrl+C 來(lái)中斷這個(gè)程序,你會(huì)看到程序?qū)⒉东@的信號(hào),并會(huì)通過(guò)打印展示出來(lái),如下所示:

    Going to sleep....
    Going to sleep....
    Going to sleep....
    Interrupt signal (2) received.

raise() 函數(shù)

您可以通過(guò) raise() 函數(shù)生成信號(hào),它用一個(gè)整數(shù)的信號(hào)編號(hào)作為參數(shù),語(yǔ)法如下所示。

    int raise (signal sig);

這里的 sig 是要發(fā)送的信號(hào)編號(hào),這些信號(hào)是:SIGINT,SIGABRT,SIGFPE,SIGILL,SIGSEGV,SIGTERM,SIGHUP。以下是我們使用 raise() 函數(shù)從程序內(nèi)部發(fā)出一個(gè)信號(hào)的例子:

    #include <iostream>
    #include <csignal>

    using namespace std;

    void signalHandler( int signum )
    {
    cout << "Interrupt signal (" << signum << ") received.\n";

    // cleanup and close up stuff here  
    // terminate program  

       exit(signum);  

    }

    int main ()
    {
    int i = 0;
    // register signal SIGINT and signal handler  
    signal(SIGINT, signalHandler);  

    while(++i){
       cout << "Going to sleep...." << endl;
       if( i == 3 ){
      raise( SIGINT);
       }
       sleep(1);
    }

    return 0;
    }

當(dāng)上述代碼編譯和執(zhí)行后,將會(huì)產(chǎn)生以下的結(jié)果,并且這些結(jié)果會(huì)自動(dòng)出現(xiàn):

    Going to sleep....
    Going to sleep....
    Going to sleep....
    Interrupt signal (2) received.
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)