信號(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)。 |
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.
您可以通過(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.
更多建議: