程序通訊之 一 訊號機制實驗

2021-04-17 15:11:39 字數 4937 閱讀 2732

unix/linux系統的程序間通訊機構(ipc)允許在任意程序間大批量地交換資料。本實驗的目的是了解和熟悉linux支援的訊號量機制、管道機制、訊息通訊機制及共享儲存區機制。

()訊號機制實驗

實驗目的

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)執行使用者設定的軟中斷處理程式。

二、所涉及的中斷呼叫

1kill( )

系統呼叫格式

int kill(pid,sig)

引數定義

int pid,sig;

其中,pid是乙個或一組程序的識別符號,引數sig是要傳送的軟中斷訊號。

(1)pid>0時,核心將訊號傳送給程序pid。

(2)pid=0時,核心將訊號傳送給與傳送程序同組的所有程序。

(3)pid=-1時,核心將訊號傳送給所有使用者識別符號真正等於傳送程序的有效使用者標識號的程序。

2signal( )

預置對訊號的處理方式,允許呼叫程序控制軟中斷訊號。

系統呼叫格式

signal(sig,function)

標頭檔案為

#include

引數定義

signal(sig,function)

int sig;

void (*func) ( )

其中sig用於指定訊號的型別,sig為0則表示沒有收到任何訊號,餘者如下表:

, 值名 字

說          明

sighup

掛起(hangup)

sigint

中斷,當使用者從鍵盤按^c鍵或^break鍵時

sigquit

退出,當使用者從鍵盤按quit鍵時

sigill

非法指令

sigtrap

跟蹤陷阱(trace trap),啟動程序,跟蹤**的執行

sigiot

iot指令

sigemt

emt指令

sigfpe

浮點運算溢位

sigkill

殺死、終止程序

sigbus

匯流排錯誤

sigsegv

段違例(segmentation violation),程序試圖去訪問其虛位址空間以外的位置

sigsys

系統呼叫中引數錯,如系統呼叫號非法

sigpipe

向某個非讀管道中寫入資料

sigalrm

鬧鐘。當某程序希望在某時間後接收訊號時發此訊號

sigterm

軟體終止(software termination)

sigusr1

使用者自定義訊號1

sigusr2

使用者自定義訊號2

sigcld

某個子程序死

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( )

int p1,p2,stdout;

while((p1=fork( ))= =-1);       /*建立子程序p1*/

if (p1>0)

while((p2=fork( ))= =-1);     /*建立子程序p2*/

if(p2>0)

wait_mark=1;

signal(sigint,stop);   /*接收到^c訊號,轉stop*/

waiting( );

kill(p1,16);        /*向p1發軟中斷訊號16*/

kill(p2,17);        /*向p2發軟中斷訊號17*/

wait(0);           /*同步*/

wait(0);

printf("parent process is killed!/n");

exit(0);

else

wait_mark=1;

signal(17,stop);   /*接收到軟中斷訊號17,轉stop*/

waiting( );

lockf(stdout,1,0);

printf("child process 2 is killed by parent!/n");

lockf(stdout,0,0);

exit(0);

else

wait_mark=1;

signal(16,stop);        /*接收到軟中斷訊號16,轉stop*/

waiting( );

lockf(stdout,1,0);

printf("child process 1 is killed by parent!/n");

lockf(stdout,0,0);

exit(0);}}

void waiting( )

while(wait_mark!=0);

void stop( )

wait_mark=0;

四、執行結果

螢幕上無反應,按下^c後,顯示 parent process is killed!

五、分析原因

上述程式中,signal( )都放在一段程式的前面部位,而不是在其他接收訊號處。這是因為signal( )的執行只是為程序指定訊號值16或17的作用,以及分配相應的與stop( )過程鏈結的指標。因而,signal( )函式必須在程式前面部分執行。

本方法通訊效率低,當通訊資料量較大時一般不用此法。

六、思考

1、該程式段前面部分用了兩個wait(0),它們起什麼作用?

2、該程式段中每個程序退出時都用了語句exit(0),為什麼?

3、為何預期的結果並未顯示出?

4、程式該如何修改才能得到正確結果?

5、不修改程式如何得到期望的輸出?

Linux訊號機制(一) 訊號

在linux中訊號是程序間通訊的重要手段,訊號可以通知乙個程序發生了什麼,訊號的產生是突發事件,所以也被稱為 軟體中斷 通過檢視檔案了解到訊號是巨集定義的常量,以sig開頭 值得注意的是 不存在值為0的訊號,值為0的訊號稱為空訊號,kill函式對值為0的訊號有特殊的應用 當乙個程序收到乙個訊號,有三...

程序間通訊 訊號機制

最近工作中,有需要用到乙個程序向另乙個程序發訊號.於是,寫了一簡單的例子 一.訊號接受方 include include static void sigaction handle int signum,siginfo t info,void p int main return 0 二.訊號傳送方 i...

程序間通訊之訊號機制 Linux

一 訊號 1 訊號的基本概念 每個訊號都對應乙個正整數常量 稱為 signal number,即訊號編號。定義在系統標頭檔案中 代表同一使用者的諸程序之間傳送事先約定的資訊的型別,用於通知某程序發生了某異常事件。每個程序在執行時,都要通過訊號機制來檢查是否有訊號到達。若有,便中斷正在執行的程式,轉向...