實驗三 軟中斷通訊
實驗目的
1、了解什麼是訊號
2、熟悉linux系統中程序之間軟中斷通訊的基本原理
實驗內容
1、編寫程式:用fork( )建立兩個子程序,再用系統呼叫signal( )讓父程序捕捉鍵盤上來的中斷訊號(即按^c鍵);捕捉到中斷訊號後,父程序用系統呼叫kill( )向兩個子程序發出訊號,子程序捕捉到訊號後分別輸出下列資訊後終止:
child process1 is killed by parent!
child process2 is killed by parent!
父程序等待兩個子程序終止後,輸出如下的資訊後終止:
parent process is killed!
2、分析利用軟中斷通訊實現程序同步的機理
實驗指導
一、訊號
1、訊號的基本概念
每個訊號都對應乙個正整數常量(稱為signal number,即訊號編號。定義在系統標頭檔案中),代表同一使用者的諸程序之間傳送事先約定的資訊的型別,用於通知某程序發生了某異常事件。每個程序在執行時,都要通過訊號機制來檢查是否有訊號到達。若有,便中斷正在執行的程式,轉向與該訊號相對應的處理程式,以完成對該事件的處理;處理結束後再返回到原來的斷點繼續執行。實質上,訊號機制是對中斷機制的一種模擬,故在早期的unix版本中又把它稱為軟中斷。
訊號與中斷的相似點:
(1)採用了相同的非同步通訊方式;
(2)當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式;
(3)都在處理完畢後返回到原來的斷點;
(4)對訊號或中斷都可進行遮蔽。
訊號與中斷的區別:
(1)中斷有優先順序,而訊號沒有優先順序,所有的訊號都是平等的;
(2)訊號處理程式是在使用者態下執行的,而中斷處理程式是在核心態下執行;
(3)中斷響應是及時的,而訊號響應通常都有較大的時間延遲。
訊號機制具有以下三方面的功能:
(1)傳送訊號。傳送訊號的程式用系統呼叫kill( )實現;
(2)預置對訊號的處理方式。接收訊號的程式用signal( )來實現對處理方式的預置;
(3)收受訊號的程序按事先的規定完成對相應事件的處理。
2、訊號的傳送
訊號的傳送,是指由傳送程序把訊號送到指定程序的訊號域的某一位上。如果目標程序正在乙個可被中斷的優先順序上睡眠,核心便將它喚醒,傳送程序就此結束。乙個程序可能在其訊號域中有多個位被置位,代表有多種型別的訊號到達,但對於一類訊號,程序卻只能記住其中的某乙個。
程序用kill( )向乙個程序或一組程序傳送乙個訊號。
3、對訊號的處理
當乙個程序要進入或退出乙個低優先順序睡眠狀態時,或乙個程序即將從核心態返回使用者態時,核心都要檢查該程序是否已收到軟中斷。當程序處於核心態時,即使收到軟中斷也不予理睬;只有當它返回到使用者態後,才處理軟中斷訊號。對軟中斷訊號的處理分三種情況進行:
(1)如果程序收到的軟中斷是乙個已決定要忽略的訊號(function=1),程序不做任何處理便立即返回;
(2)程序收到軟中斷後便退出(function=0);
(3)執行使用者設定的軟中斷處理程式。
二、所涉及的中斷呼叫
1、kill( )
系統呼叫格式
int kill(pid,sig)
引數定義
int pid,sig;
其中,pid是乙個或一組程序的識別符號,引數sig是要傳送的軟中斷訊號。
(1)pid>0時,核心將訊號傳送給程序pid。
(2)pid=0時,核心將訊號傳送給與傳送程序同組的所有程序。
(3)pid=-1時,核心將訊號傳送給所有使用者識別符號真正等於傳送程序的有效使用者標識號的程序。
2、signal( )
預置對訊號的處理方式,允許呼叫程序控制軟中斷訊號。
系統呼叫格式
signal(sig,function)
標頭檔案為
#include
引數定義
signal(sig,function)
int sig;
void (*func) ( )
其中sig用於指定訊號的型別,sig為0則表示沒有收到任何訊號,餘者如下表:
值 名 字 說 明
01 sighup 掛起(hangup)
02 sigint 中斷,當使用者從鍵盤按^c鍵或^break鍵時
03 sigquit 退出,當使用者從鍵盤按quit鍵時
04 sigill 非法指令
05 sigtrap 跟蹤陷阱(trace trap),啟動程序,跟蹤**的執行
06 sigiot iot指令
07 sigemt emt指令
08 sigfpe 浮點運算溢位
09 sigkill 殺死、終止程序
10 sigbus 匯流排錯誤
11 sigsegv 段違例(segmentation violation),程序試圖去訪問其虛位址空間以外的位置
12 sigsys 系統呼叫中引數錯,如系統呼叫號非法
13 sigpipe 向某個非讀管道中寫入資料
14 sigalrm 鬧鐘。當某程序希望在某時間後接收訊號時發此訊號
15 sigterm 軟體終止(software termination)
16 sigusr1 使用者自定義訊號1
17 sigusr2 使用者自定義訊號2
18 sigcld 某個子程序死
19 sigpwr 電源故障
function:在該程序中的乙個函式位址,在核心返回使用者態時,它以軟中斷訊號的序號作為引數呼叫該函式,對除了訊號sigkill,sigtrap和sigpwr以外的訊號,核心自動地重新設定軟中斷訊號處理程式的值為sig_dfl,乙個程序不能捕獲sigkill訊號。
function 的解釋如下:
(1)function=1時,程序對sig類訊號不予理睬,亦即遮蔽了該類訊號;
(2)function=0時,預設值,程序在收到sig訊號後應終止自己;
(3)function為非0,非1類整數時,function的值即作為訊號處理程式的指標。
三、參考程式
#include
#include
#include
void waiting( ),stop( );
int wait_mark;
main( )
else
}else
}void waiting( )
void stop( )
四、執行結果
螢幕上無反應,按下^c後,顯示 parent process is killed!
五、分析原因
上述程式中,signal( )都放在一段程式的前面部位,而不是在其他接收訊號處。這是因為signal( )的執行只是為程序指定訊號值16或17的作用,以及分配相應的與stop( )過程鏈結的指標。因而,signal( )函式必須在程式前面部分執行。
本方法通訊效率低,當通訊資料量較大時一般不用此法。
六、思考
1、該程式段前面部分用了兩個wait(0),它們起什麼作用?
2、該程式段中每個程序退出時都用了語句exit(0),為什麼?
3、為何預期的結果並未顯示出?
4、程式該如何修改才能得到正確結果?
5、不修改程式如何得到期望的輸出?
軟中斷通訊
一 內容 編寫一段c語言程式,使其實現程序的軟中斷通訊。二 要求 使用系統呼叫fork 創造二個程序,父程序睡眠2秒後,用系統呼叫kill 向兩個子程序發出訊號,子程序捕捉到資訊後分別輸出下列資訊終止 child processl1 is killed by parent!child process...
Linux軟中斷通訊
程序對訊號的響應 1 忽略訊號 不採取任何操作 有兩個訊號不能被忽略 sigkill和sigstop。如果忽略,系統管理無法殺死 暫停程序,無法對系統進行管理。2 捕獲並處理訊號 3 執行預設操作,通常是終止程序 訊號的預設操作 通過 man 7 signal 檢視 系統呼叫或庫函式 1 lockf...
程序間通訊(IPC)之軟中斷
緊張的考研生活隨著網路遊戲的gameover拉開了序幕,同時也進入了全面的複習階段。每天看了什麼,掌握了什麼必須有個小小的總結,或者說是讀書心得。所有的心得都分門別類,今天就談談作業系統中的程序間通訊。細想下,程序間通訊的方式還真有點多有點雜,還是一點點的來吧,畢竟我是在給自己理思路哈。第一種就是利...