訊號的基本概念以及訊號的產生

2021-08-18 12:00:49 字數 1870 閱讀 4527

一. 訊號產生的場景

1. 使用者輸入命令, 在shell 啟動乙個前台程序

2. 當使用者按一下 ctrl + c 的時候,從鍵盤產生乙個硬體中斷

3. 此時cpu 正在執行這個程序的帶**, 則該程序的執行**暫停執行, cpu 從使用者態切換到核心態處理該硬體中斷.

4. 中斷驅動程式將ctrl + c 解釋為乙個 sigin 訊號, 記在該程序的 pcb 中(作業系統給程序法送了乙個 sugin 訊號)

5. 當作業系統要從核心返回到該程序的**繼續執行之前, 首先要處理pcb中記錄的訊號, 發現了乙個 sugin 訊號, 而該訊號的預設處理動作是終止程序, 所以此時程序直接終止, 不再返回.

注意:1. ctr + c 只能發給乙個前台正在執行的程序, 乙個命令後加 & 便可以將該程序放在後台取執行, 這樣shell就不用等待程序結束便可以啟動新的程序

2. shell 可以一次執行乙個前台程序, 但可以一次執行多個後台程序, 只有前台訊號才能接受控制鍵產生的訊號

3. 程序在執行的如何時候都可以接到像 ctr + c 的這種鍵盤控制訊號而終止, 因此訊號相對於程序而言是非同步的.

檢視訊號的命令: kill -l

其中前 31 個訊號屬於普通訊號, 沒有 32 和 33 號訊號, ctrl + c 產生 11 號 sigsegv 訊號, ctrl + z 產生 sigtstp 20 號訊號, ctrl + / 產生 sigquit 3 號訊號.

二. 訊號產生的幾種方式

1. 使用者在終端鍵盤產生中斷,終端驅動程式會傳送訊號給當前前台程序,.

2. 硬體異常產生中斷,如執行除以 0 的操作, 此時 cpu 運算單元產生異常, 核心將這個異常解釋為乙個 sugfpe 傳送給該前台程序, 或者當程式訪問了非法記憶體時, 此時mmu產生乙個異常, 核心將這個異常解釋為 sigsegv 傳送給該程序.

3. 通過命令給當前程序傳送訊號 kill -11 test(給test程序傳送 11 號訊號)

4. 軟體條件產生異常, 如管道讀寫時, 讀端關閉, 此時寫端還在繼續寫, 此時,作業系統會給當前程序傳送乙個 13 號訊號, 程序發現這個訊號, 退出.

三. 呼叫系統函式給訊號傳送訊號

1.kill -訊號編號 程序編號

2.kill -訊號名 程序編號

該程序是乙個死迴圈的程式, 但此時給該程序傳送乙個11號訊號, 這個訊號在程序眼裡就是乙個sigegv 訊號, 程序收到這個訊號的預設執行動作是終止訊號, 並且給使用者傳送段錯誤提示資訊.

3. kill 命令的函式實現

其中 pid 指的是該程序的 pid, sig 指的是需要傳送的訊號的編號.

kill 函式用來給對應程序傳送乙個編號為 sig 的訊號

raise 函式用來給當前程序傳送乙個編號為 signo 的訊號

abort 函式是是當前訊號接收到訊號而異常終止

四. 軟體條件產生訊號

用來設定乙個鬧鐘, 告訴核心在 seconds 秒之後給程序傳送乙個sigalrm 訊號, 該訊號的預設執行動作時終止當前程序. 函式的返回值是 0 或者是以前設定的鬧鐘時間還餘下的秒數.如果將 seconds 設為 0, 表示取消以前設定的鬧鐘,鬧鐘的返回值任然是以前設定的鬧鐘剩餘的秒數.

訊號的基本概念及產生方式

通俗一點說,訊號一般做提醒工作,提醒之後會產生一系列的動作,比如紅綠燈 過馬路見到紅燈亮了,提醒自己應該停止過馬路,或者聽到鬧鐘響了,或許很多人的動作是關掉鬧鐘後接著睡吧,但接著睡也是一種動作吧。在計算機中,訊號是由作業系統發出的。首先先看一下計算機中的訊號吧。1 sighup 2 sigint 3...

訊號基本概念

sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程序 sigquit 建立core檔案終止程序,並且生成core檔案 sigill 建立core檔案 非法指令 sigtrap 建立core檔案 跟蹤自陷 sigbus 建立core檔案 匯流排錯誤 sigsegv 建立core檔...

訊號基本概念

訊號是資訊的載體,linux unix環境下,古老 經典的通訊方式,現下依然是最主要的通訊手段。a給b傳送訊號,b收到訊號之前執行自己的 收到訊號後,不管執行到程式的什麼位置,都要暫停執行,去處理訊號,處理完畢再繼續執行。訊號是軟體層面上實現的中斷,早期稱為 軟中斷 產生訊號 遞達 遞送並且到達程序...