一、內容:
編寫一段c語言程式,使其實現程序的軟中斷通訊。
二、要求:
使用系統呼叫fork()創造二個程序,父程序睡眠2秒後,用系統呼叫kill() 向兩個子程序發出訊號,子程序捕捉到資訊後分別輸出下列資訊終止:
child processl1 is killed by parent!
child processl2 is killed by parent!
父程序等待兩個子程序終止後,輸出如下的資訊後終止:
parent process is killed!
parent process is killed!
三、思考題:
(1) 在父程序中使用兩個wait(0),它們起什麼作用?
(2) 該程式段每個程序退出時都用了語句exit(0),為什麼?
四、實驗報告要求:
(1) 列出除錯通過程式的清單,分析執行結果。
(2) 回答思考題;
(3) 總結上機除錯過程中所遇到的問題和解決方法及感想。
五、實驗預備知識:
附錄:一、訊號
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( )
功能描述:
用於向任何程序組或程序傳送訊號。
系統呼叫格式
#include
#include
intkill(pid,sig)
引數定義
int pid,sig;
其中,pid是乙個或一組程序的識別符號,引數sig是要傳送的軟中斷訊號。
(1)pid>0時,核心將訊號傳送給程序pid。
(2)pid=0時,核心將訊號傳送給與傳送程序同組的所有程序。
(3)pid=-1時,核心將訊號傳送給所有使用者識別符號真正等於傳送程序的有效使用者標識號的程序。
2、signal( )
預置對訊號的處理方式,允許呼叫程序控制軟中斷訊號。
系統呼叫格式
#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 sigchld 某個子程序死
19 sigpwr 電源故障
function:是乙個處理函式,或者是:
sig_ign:忽略引數sig所指的訊號
sig_dfl:恢復引數sig所指訊號的處理方法為預設值
3、wait( )函式
wait()函式常用來控制父程序與子程序的同步。在父程序中呼叫wait()函式,則父程序被阻塞,進入等待佇列,等待子程序結束。當子程序結束時,會產生乙個終止狀態字,系統會向父程序發出sigchld訊號。當接到訊號後,父程序提取子程序的終止狀態字,從wait()函式返回繼續執行原程式。
其呼叫格式為:
(pid_t) wait(int
*statloc);
正確返回:大於0:子程序的程序id值;
等於0:其它。
錯誤返回:等於-1:呼叫失敗。
4、exit()函式
exit()函式是程序結束最常呼叫的函式,在main()函式中呼叫return,最終也是呼叫exit()函式。這些都是程序的正常終止。在正常終止時,exit()函式返回程序結束狀態。
其呼叫格式為: #include
void exit(int status);
其中status為程序結束狀態。
請同學們先試一下這個示例程式,然後再考慮實驗內容。
#include
#include
#include
#include
#include
void sss( )
main ()
printf(「process finished\n」);}]
程式框架示例:
#include
#include
#include
#include
#include
void waiting(),stop();
int wait_mark;
main()
void stop()
思考題、討論題、作業
教學後記
Linux軟中斷通訊
程序對訊號的響應 1 忽略訊號 不採取任何操作 有兩個訊號不能被忽略 sigkill和sigstop。如果忽略,系統管理無法殺死 暫停程序,無法對系統進行管理。2 捕獲並處理訊號 3 執行預設操作,通常是終止程序 訊號的預設操作 通過 man 7 signal 檢視 系統呼叫或庫函式 1 lockf...
實驗三 軟中斷通訊
實驗三 軟中斷通訊 實驗目的 1 了解什麼是訊號 2 熟悉linux系統中程序之間軟中斷通訊的基本原理 實驗內容 1 編寫程式 用fork 建立兩個子程序,再用系統呼叫signal 讓父程序捕捉鍵盤上來的中斷訊號 即按 c鍵 捕捉到中斷訊號後,父程序用系統呼叫kill 向兩個子程序發出訊號,子程序捕...
程序間通訊(IPC)之軟中斷
緊張的考研生活隨著網路遊戲的gameover拉開了序幕,同時也進入了全面的複習階段。每天看了什麼,掌握了什麼必須有個小小的總結,或者說是讀書心得。所有的心得都分門別類,今天就談談作業系統中的程序間通訊。細想下,程序間通訊的方式還真有點多有點雜,還是一點點的來吧,畢竟我是在給自己理思路哈。第一種就是利...