用asp.net開發(fā)網(wǎng)站的優(yōu)勢最近發(fā)生的新聞大事
👻 概念
- 信號 —— 操作系統(tǒng)傳給進(jìn)程的中斷,會提早終止程序
- 有些信號不能被程序捕獲,有些則可以被捕獲,并基于信號采取適當(dāng)?shù)膭幼?/li>
信號 | 描述 |
---|---|
SIGABRT | 程序的異常終止,如調(diào)用 abort |
SIGFPE | 錯誤的算術(shù)運算,比如除以零或?qū)е乱绯龅牟僮?/td> |
SIGILL | 檢測非法指令 |
SIGINT | 程序終止 (interrupt) 信號 |
SIGSEGV | 非法訪問內(nèi)存 |
SIGTERM | 發(fā)送到程序的終止請求 |
👻 準(zhǔn)備工作
使用信號處理需要包含 <csignal>
頭文件:
#include <csignal>
👻 捕獲信號
👾語法格式
使用 signal()
函數(shù) 捕獲信號
void signal(registered signal, signal handler)
-
參數(shù)
signal
—— 要設(shè)置信號的標(biāo)識符 -
參數(shù)
handler
—— 指向信號處理函數(shù)的指針,函數(shù)返回值是指向先前信號處理函數(shù)的指針:- 先前沒有設(shè)置信號處理函數(shù),返回值為
SIG_DFL
- 先前設(shè)置的信號處理函數(shù)為
SIG_IGN
,則返回值為SIG_IGN
- 先前沒有設(shè)置信號處理函數(shù),返回值為
👾示例代碼
- 使用
signal()
函數(shù)捕獲SIGINT
信號,并將其與信號處理程序signalHandler()
相關(guān)聯(lián)。
void signalHandler(int signum) {cout << "Interrupt signal (" << signum << ") received.\n";exit(signum); // 終止程序
}...// 注冊信號 SIGINT 和信號處理程序
signal(SIGINT, signalHandler);
while(1) {cout << "Going to sleep...." << endl;sleep(1);
}
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received. // 按下 ctrl+c 鍵時退出程序
👻 生成信號
👾語法格式
使用 raise()
函數(shù) 生成信號
int raise (signal sig);
- 參數(shù)
sig
—— 要發(fā)送的整數(shù)信號編號,包括SIGINT
、SIGABRT
、SIGFPE
、SIGILL
、SIGSEGV
、SIGTERM
、SIGHUP
👾示例代碼
- 使用
raise()
函數(shù)生成SIGINT
信號,并通過signal()
函數(shù)捕獲并處理。
void signalHandler( int signum ) {cout << "Interrupt signal (" << signum << ") received.\n";exit(signum);
}...signal(SIGINT, signalHandler);int i = 0;
while(++i) {cout << "Going to sleep...." << endl;if(i==3)raise( SIGINT); // 生成 SIGINT 信號sleep(1);
}
Sleep函數(shù)
功能:執(zhí)行掛起,等待一段時間后再繼續(xù)執(zhí)行
用法:
void Sleep(DWORD dwMilliseconds); // Windows系統(tǒng),dwMilliseconds單位毫秒
unsigned int sleep(unsigned int seconds); // POSIX系統(tǒng),seconds單位秒
注意
POSIX
系統(tǒng)(如Linux
和macOS
)—— 使用#include <unistd.h>
和sleep()
,單位秒
Windows
系統(tǒng) —— 使用#include <windows.h>
和Sleep()
,單位毫秒