程序間通訊之訊號機制 Linux

2021-08-20 16:21:55 字數 3386 閱讀 2750

一、訊號

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(int pid,int sig)

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

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

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

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

2、

signal( )

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

系統呼叫格式

signal(sig,function)

標頭檔案為

#include

引數定義

int  sig;

void (*func) ()

function

:在該程序中的乙個函式位址,在核心返回使用者態時,它以軟中斷訊號的序號作為引數呼叫該函式,對除了訊號sigkill,sigtrap和sigpwr以外的訊號,核心自動地重新設定軟中斷訊號處理程式的值為sig

_dfl,乙個程序不能捕獲sigkill訊號。

function

的解釋如下:

(1)function=1時,程序對sig類訊號不予理睬,亦即遮蔽了該類訊號;

(2)function=0時,預設值,程序在收到sig訊號後應終止自己;

(3)function為非0,非1類整數時,function的值即作為訊號處理程式的指標。

sig:

用於指定訊號的型別,sig為0則表示沒有收到任何訊號,餘者用命令 kill -l 檢視,

部分說明如下,值

名  字

說          明 01

sighup

掛起(hangup) 02

sigint

中斷,當使用者從鍵盤按

^c鍵或

^break鍵時

03 sigquit

退出,當使用者從鍵盤按

quit鍵時

04 sigill

非法指令 05

sigtrap

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

sigabrt

一般用於訊號中一些關鍵的處理,assert失敗時也會使用它。07

sigbus

匯流排錯誤08

sigfpe

浮點運算溢位 09

sigkill

殺死、終止程序 10

sigusr1

使用者自定義訊號111

sigsegv

段違例(s

egmentation  violation),程序試圖去訪問其虛位址空間以外的位置 12

sigusr2

使用者自定義訊號213

sigpipe

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

sigalrm

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

sigterm

軟體終止(software  termination)

三、編寫程式

建立兩個子程序,父程序在接收到中斷訊號(sigint)後,呼叫kill( )向兩個子程序發出使用者自定義訊號(sigusr1和sigusr2),子程序捕捉到訊號後,兩個子程序分別輸出列印(printf):

child process1 is killed by parent!

child process2 is killed by parent!

父程序等待兩個子程序終止後,輸出如下的資訊後終止:

parent process is killed!

#include #include #include #include void waiting( ),stop( ),nothing( );

int wait_mark;

main( )

else

}else }

void waiting( )

void stop( )

void nothing(){}

執行結果:

程序間通訊 訊號機制

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

Linux程序間通訊(二) 訊號機制

訊號方式 軟中斷訊號signal,簡稱訊號,用來通知程序發生了非同步時間。程序之間可以通過系統呼叫kill等函式來傳送軟中斷訊號,通知程序發生了某個事件,但訊號只能用來通知程序發生了什麼事件,並不給該程序傳遞任何資料。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達 訊號處理的三個過程 傳送...

Linux 信 號 機 制

前面介紹了訊號的基本概念,在這一節中,我們將介紹核心如何實現訊號機制。即核心如何向乙個程序傳送訊號 程序如何接收乙個訊號 程序怎樣控制自己對訊號的反應 核心在什麼時機處理和怎樣處理程序收到的訊號。還要介紹一下setjmp和longjmp在訊號中起到的作用。1 核心對訊號的基本處理方法 核心給乙個程序...