信号的基本概念以及信号的产生
一. 信號(hào)產(chǎn)生的場(chǎng)景
???? 1. 用戶(hù)輸入命令, 在shell 啟動(dòng)一個(gè)前臺(tái)進(jìn)程
???? 2. 當(dāng)用戶(hù)按一下 Ctrl + C 的時(shí)候,從鍵盤(pán)產(chǎn)生一個(gè)硬件中斷
???? 3. 此時(shí)CPU 正在執(zhí)行這個(gè)進(jìn)程的帶代碼, 則該進(jìn)程的執(zhí)行代碼暫停執(zhí)行, CPU 從用戶(hù)態(tài)切換到內(nèi)核態(tài)處理該硬件中斷.
???? 4. 中斷驅(qū)動(dòng)程序?qū)trl + C 解釋為一個(gè) SIGIN 信號(hào), 記在該進(jìn)程的 PCB 中(操作系統(tǒng)給進(jìn)程法送了一個(gè) SUGIN 信號(hào))
???? 5. 當(dāng)操作系統(tǒng)要從內(nèi)核返回到該進(jìn)程的代碼繼續(xù)執(zhí)行之前, 首先要處理PCB中記錄的信號(hào), 發(fā)現(xiàn)了一個(gè) SUGIN 信號(hào), 而該信號(hào)的默認(rèn)處理動(dòng)作是終止進(jìn)程, 所以此時(shí)進(jìn)程直接終止, 不再返回.
注意:
????1. Ctr + C 只能發(fā)給一個(gè)前臺(tái)正在運(yùn)行的進(jìn)程, 一個(gè)命令后加 & 便可以將該進(jìn)程放在后臺(tái)取執(zhí)行, 這樣shell就不用等待進(jìn)程結(jié)束便可以啟動(dòng)新的進(jìn)程
????2. shell 可以一次執(zhí)行一個(gè)前臺(tái)進(jìn)程, 但可以一次執(zhí)行多個(gè)后臺(tái)進(jìn)程, 只有前臺(tái)信號(hào)才能接受控制鍵產(chǎn)生的信號(hào)
????3. 進(jìn)程在運(yùn)行的如何時(shí)候都可以接到像 Ctr + C 的這種鍵盤(pán)控制信號(hào)而終止, 因此信號(hào)相對(duì)于進(jìn)程而言是異步的.
查看信號(hào)的命令: kill -l
????其中前 31 個(gè)信號(hào)屬于普通信號(hào), 沒(méi)有 32 和 33 號(hào)信號(hào), Ctrl + C 產(chǎn)生 11 號(hào) SIGSEGV 信號(hào), Ctrl + Z 產(chǎn)生 SIGTSTP 20 號(hào)信號(hào), Ctrl + / 產(chǎn)生 SIGQUIT 3 號(hào)信號(hào).
二. 信號(hào)產(chǎn)生的幾種方式
????1. 用戶(hù)在終端鍵盤(pán)產(chǎn)生中斷,終端驅(qū)動(dòng)程序會(huì)發(fā)送信號(hào)給當(dāng)前前臺(tái)進(jìn)程,.
????2. 硬件異常產(chǎn)生中斷,如執(zhí)行除以 0 的操作, 此時(shí) CPU 運(yùn)算單元產(chǎn)生異常, 內(nèi)核將這個(gè)異常解釋為一個(gè) SUGFPE 發(fā)送給該前臺(tái)進(jìn)程, 或者當(dāng)程序訪(fǎng)問(wèn)了非法內(nèi)存時(shí), 此時(shí)MMU產(chǎn)生一個(gè)異常, 內(nèi)核將這個(gè)異常解釋為 SIGSEGV 發(fā)送給該進(jìn)程.
????3. 通過(guò)命令給當(dāng)前進(jìn)程發(fā)送信號(hào) kill -11 test(給test進(jìn)程發(fā)送 11 號(hào)信號(hào))
????4. 軟件條件產(chǎn)生異常, 如管道讀寫(xiě)時(shí), 讀端關(guān)閉, 此時(shí)寫(xiě)端還在繼續(xù)寫(xiě), 此時(shí),操作系統(tǒng)會(huì)給當(dāng)前進(jìn)程發(fā)送一個(gè) 13 號(hào)信號(hào), 進(jìn)程發(fā)現(xiàn)這個(gè)信號(hào), 退出.
三. 調(diào)用系統(tǒng)函數(shù)給信號(hào)發(fā)送信號(hào)
????1.kill -信號(hào)編號(hào) 進(jìn)程編號(hào)
????2.kill -信號(hào)名 進(jìn)程編號(hào)
????????????????
????該進(jìn)程是一個(gè)死循環(huán)的程序, 但此時(shí)給該進(jìn)程發(fā)送一個(gè)11號(hào)信號(hào), 這個(gè)信號(hào)在進(jìn)程眼里就是一個(gè)SIGEGV 信號(hào), 進(jìn)程收到這個(gè)信號(hào)的默認(rèn)執(zhí)行動(dòng)作是終止信號(hào), 并且給用戶(hù)發(fā)送段錯(cuò)誤提示信息.
????3. kill 命令的函數(shù)實(shí)現(xiàn)
????????????????????????????????
????其中 pid 指的是該進(jìn)程的 pid, sig 指的是需要發(fā)送的信號(hào)的編號(hào).
????kill 函數(shù)用來(lái)給對(duì)應(yīng)進(jìn)程發(fā)送一個(gè)編號(hào)為 sig 的信號(hào)
????raise 函數(shù)用來(lái)給當(dāng)前進(jìn)程發(fā)送一個(gè)編號(hào)為 signo 的信號(hào)
????abort 函數(shù)是是當(dāng)前信號(hào)接收到信號(hào)而異常終止
四. 軟件條件產(chǎn)生信號(hào)
?????????????????????????????
????用來(lái)設(shè)定一個(gè)鬧鐘, 告訴內(nèi)核在 seconds 秒之后給進(jìn)程發(fā)送一個(gè)SIGALRM 信號(hào), 該信號(hào)的默認(rèn)執(zhí)行動(dòng)作時(shí)終止當(dāng)前進(jìn)程. 函數(shù)的返回值是 0 或者是以前設(shè)定的鬧鐘時(shí)間還余下的秒數(shù).如果將 seconds 設(shè)為 0, 表示取消以前設(shè)定的鬧鐘,鬧鐘的返回值任然是以前設(shè)定的鬧鐘剩余的秒數(shù).
總結(jié)
以上是生活随笔為你收集整理的信号的基本概念以及信号的产生的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。