第六章 信號(hào)和信號(hào)處理
信號(hào)和中斷
-
信號(hào):發(fā)送給進(jìn)程的請(qǐng)求,將進(jìn)程從正常執(zhí)行轉(zhuǎn)移到中斷處理
-
中斷:從I/O設(shè)備或協(xié)處理器發(fā)送到CPU的外部請(qǐng)求,它將CPU從正常執(zhí)行轉(zhuǎn)移到中斷處理
Unix/Linux信號(hào)示例
-
Ctrl+C:當(dāng)前運(yùn)行的進(jìn)程終止。生成一個(gè)鍵盤硬件中斷。鍵盤中斷處理程序?qū)?Ctrl+C"組合鍵轉(zhuǎn)換為SIDINT(2)信號(hào),發(fā)送給終端上的所有進(jìn)程,并喚醒等待鍵盤輸入的進(jìn)程。
-
nohup a.out&:在后臺(tái)運(yùn)行一個(gè)程序,即使用戶推出后,進(jìn)程仍然繼續(xù)執(zhí)行。
-
kill pid (or kill -s 9 pid):用戶再次登錄時(shí)也許會(huì)發(fā)現(xiàn)(通過(guò)ps-u LTD)后臺(tái)進(jìn)程仍在運(yùn)行。用戶可以使用sh命令kill pid (or kill -s 9 pid)殺死該進(jìn)程。
Unix/Linux中的信號(hào)處理
信號(hào)類型
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#dpfine STGTTTN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGPOLL 29
#define SIGPWR 30
#define SIGSYS 31
信號(hào)的來(lái)源
-
來(lái)自硬件中斷的信號(hào):在執(zhí)行過(guò)程中,一些硬件中斷被轉(zhuǎn)換為信號(hào)發(fā)送給進(jìn)程硬件信號(hào)示例。
-
來(lái)自異常的信號(hào):常見的陷阱信號(hào)有SIGFPE(8),表示浮點(diǎn)異常(除以0),最常見也是最可怕的時(shí)SIGSEGV(11),表示段錯(cuò)誤。
-
來(lái)自其他進(jìn)程的信號(hào):進(jìn)程可以使用kill(pid,sig)系統(tǒng)調(diào)用向pid標(biāo)識(shí)的目標(biāo)進(jìn)程發(fā)送信號(hào)。
信號(hào)處理函數(shù)
1.信號(hào)處理函數(shù)的注冊(cè):在編寫程序時(shí),可以使用操作系統(tǒng)提供的函數(shù)來(lái)注冊(cè)信號(hào)處理函數(shù)。通常使用 signal 或 sigaction 等函數(shù)來(lái)注冊(cè)信號(hào)處理函數(shù)。這允許您定義在接收特定信號(hào)時(shí)要執(zhí)行的自定義處理邏輯。
2.內(nèi)置信號(hào):操作系統(tǒng)定義了一些標(biāo)準(zhǔn)信號(hào),例如 SIGINT(通常由 Ctrl+C 生成)、SIGTERM(正常終止請(qǐng)求)和 SIGHUP(終端掛起或控制進(jìn)程終止)。這些信號(hào)有固定的名稱和含義。
3.信號(hào)處理函數(shù)的功能:信號(hào)處理函數(shù)可以執(zhí)行各種操作,包括但不限于以下內(nèi)容:
- 保存程序狀態(tài)或數(shù)據(jù)。
- 清理資源或關(guān)閉文件。
- 發(fā)出自定義日志消息。
- 終止進(jìn)程。
- 重新加載配置文件。
- 忽略信號(hào)。
4.信號(hào)處理函數(shù)的編寫:通常,信號(hào)處理函數(shù)是用戶編寫的函數(shù),它們必須符合特定的函數(shù)簽名,以接受信號(hào)作為參數(shù)。
5.編寫信號(hào)處理函數(shù)時(shí),需要小心處理,以確保它們不會(huì)導(dǎo)致不穩(wěn)定或不安全的行為。
安裝信號(hào)捕捉函數(shù)
int r=signal(int signal_number,void *handler)
- 用于注冊(cè)信號(hào)處理函數(shù),以便在程序接收到特定信號(hào)時(shí)執(zhí)行特定的操作。
信號(hào)處理步驟
1.當(dāng)某進(jìn)程處于內(nèi)核模式時(shí),會(huì)檢查信號(hào)并處理未完成的信號(hào)。
2.重置用戶安裝的信號(hào)捕捉函數(shù):用戶安裝的陷阱相關(guān)信號(hào)捕捉函數(shù)用于處理用戶代碼中的陷阱錯(cuò)誤。
3.信號(hào)和喚醒:在Unix/Linux內(nèi)核中有兩種SLEEP進(jìn)程;深度休眠進(jìn)程和淺度休眠進(jìn)程。
信號(hào)與異常
1.作為進(jìn)程異常的統(tǒng)一處理方法:當(dāng)進(jìn)程遇到異常時(shí),它會(huì)陷入內(nèi)核模式,將陷阱原因 轉(zhuǎn)換為信號(hào)編號(hào),并將信號(hào)發(fā)送給自己。
2.在特殊情況下,它會(huì)讓某個(gè)進(jìn)程通過(guò)信號(hào)殺死另一個(gè)進(jìn)程。
sigaction()的使用操作實(shí)踐

捕捉操作實(shí)踐
遇到的問(wèn)題
蘇格拉底挑戰(zhàn)







浙公網(wǎng)安備 33010602011771號(hào)