Linux軟中斷通訊

2021-10-06 05:20:54 字數 2206 閱讀 3374

程序對訊號的響應

(1)忽略訊號  

不採取任何操作、有兩個訊號不能被忽略:sigkill和sigstop。如果忽略,系統管理無法殺死、暫停程序,無法對系統進行管理。

(2)捕獲並處理訊號   

(3)執行預設操作,通常是終止程序

訊號的預設操作:通過 man 7 signal 檢視

系統呼叫或庫函式

1、lockf(fd,function,size)用於程序互斥

2、int  kill(pid,sig)傳遞中斷訊號

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

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

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

3、signal(sig,function)如果接收到中斷訊號就作相應處理

其中sig用於指定訊號的型別,sig為0則表示沒有收到任何訊號。常用訊號及對應鍵值見文末。

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

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

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

4、wait()和waitpid()

wait()會暫時停止程序的執行,直到有訊號來到或子程序結束。

waitpid和wait的作用本質上相同,但waitpid多出了兩個引數pid和options,

pid:pid>0時,只等待程序id等於pid的子程序,不管子程序

pid=-1時,等待任何乙個子程序退出,沒有任何限制,此時waitpid作用同wait

pid=0時,等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid不會對它做任何理睬。

pid<-1時,等待乙個指定程序組中的任何子程序,這個程序組的id等於pid的絕對值。

options提供了一些額外的選項來控制waitpid,目前在linux中只支援wnohang和wuntraced兩個選項,這是兩個常數,可以用"|"運算子把它們連線起來使用,比如:ret=waitpid(-1,null,wnohang | wuntraced)。如果我們不想使用它們,也可以把options設為0

5、sleep()和pause()

sleep(n)程序暫停n秒,ctrl+c即sigint訊號可以使sleep提前結束,繼續執行。

pause()會令目前的程序暫停(進入睡眠狀態), 直到被訊號(signal)所中斷.。

6、alarm()

alarm()用來設定訊號sigalrm 在經過引數seconds 指定的秒數後傳送給目前的程序. 如果引數seconds 為0, 則之前設定的鬧鐘會被取消, 並將剩下的時間返回。

返回值:返回之前鬧鐘的剩餘秒數, 如果之前未設鬧鐘則返回0。

可以設定忽略或者不捕獲此訊號,如果採用預設方式其動作是終止呼叫該alarm函式的程序。

附:常用訊號及對應鍵值如下:

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 sigse** 段違例(segmentation  violation),程序試圖去訪問其虛位址空間以外的位置

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

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

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

15 sigterm 軟體終止(software  termination)

16 sigusr1 使用者自定義訊號1

17 sigusr2 使用者自定義訊號2

18 sigcld 某個子程序死

19 sigpwr 電源故障

其中,sigusr1、sigusr2為使用者自定義訊號,接收到訊號後的預設處理是程序終止

軟中斷通訊

一 內容 編寫一段c語言程式,使其實現程序的軟中斷通訊。二 要求 使用系統呼叫fork 創造二個程序,父程序睡眠2秒後,用系統呼叫kill 向兩個子程序發出訊號,子程序捕捉到資訊後分別輸出下列資訊終止 child processl1 is killed by parent!child process...

實驗三 軟中斷通訊

實驗三 軟中斷通訊 實驗目的 1 了解什麼是訊號 2 熟悉linux系統中程序之間軟中斷通訊的基本原理 實驗內容 1 編寫程式 用fork 建立兩個子程序,再用系統呼叫signal 讓父程序捕捉鍵盤上來的中斷訊號 即按 c鍵 捕捉到中斷訊號後,父程序用系統呼叫kill 向兩個子程序發出訊號,子程序捕...

Linux 怎麼理解Linux軟中斷?

為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部 舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。你可以自己先想一下,這種情況...