在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 信號處理
動態(tài)內(nèi)存
類和對象
接口 (抽象類)
結(jié)構(gòu)體
循環(huán)的類型
函數(shù)
數(shù)字
日期和時間
基本語法
多態(tài)
數(shù)據(jù)抽象
注釋
命名空間
字符串
預(yù)處理器
決策語句
修飾符的類型
鍙橀噺綾誨瀷
基本輸入輸出
操作符
數(shù)組
模板
多線程
繼承
Web 編程
信號處理
指針
存儲類型
概述
引用
常量
異常處理
開發(fā)環(huán)境
重載
變量作用域
數(shù)據(jù)類型
數(shù)據(jù)封裝
文件和流

信號處理

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

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

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

signal() 函數(shù)

C++ 信號處理庫提供 signal 函數(shù)來捕獲意外事件。以下是 signal() 函數(shù)的語法:

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

簡單來說,這個函數(shù)接收兩個參數(shù):第一個參數(shù)是一個整數(shù),表示信號號碼;第二個參數(shù)是一個指向信號處理函數(shù)的指針。

讓我們用 signal() 函數(shù)寫一個簡單的 C++ 程序,用它來捕捉 SIGINT 信號。不管你想在程序中捕獲什么信號,你必須使用 signal 函數(shù)注冊該信號,并將其與信號處理程序相關(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;
    }

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

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

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

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

raise() 函數(shù)

您可以通過 raise() 函數(shù)生成信號,它用一個整數(shù)的信號編號作為參數(shù),語法如下所示。

    int raise (signal sig);

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

    #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;
    }

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

    Going to sleep....
    Going to sleep....
    Going to sleep....
    Interrupt signal (2) received.
上一篇:數(shù)字下一篇:字符串