Linux程序間的通訊方式 訊號

2021-07-23 23:18:03 字數 3075 閱讀 8461

訊號通訊

1、訊號的產生:

訊號是程序間通訊中最為長久的方式,很多條件可以產生訊號,例如:

① 當使用者按某些按鍵時,產生訊號

② 硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號

③ 程序用kill函式將訊號傳送給另乙個程序

④ 使用者可用kill命令將訊號傳送給其他程序

2、常見的幾種訊號

sighup: 從終端上發出的結束訊號

sigint: 來自鍵盤的中斷訊號(ctrl-c)

sigkill:該訊號結束接收訊號的程序,殺死程序

sigterm:kill 命令發出的訊號

sigchld:子程序停止或結束時通知父程序

sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號,暫停程序

3、訊號的一般處理流程

4、訊號的處理方式:

① 忽略此訊號

大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是:sigkill\sigstop。

這兩種訊號不能被忽略的原因是:它們向超級使用者提供了一種終止或停止程序的方法

② 執行使用者希望的動作

通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理

③ 執行系統預設動作

對大多數訊號的系統預設動作是終止該程序

5、訊號的傳送方式

(1)用kill函式傳送訊號給指定程序

函式原型:int  kill(pid_t  pid,  int  sig);

標頭檔案:#include

#include

引數:pid:

① pid > 0,傳送訊號給程序號指定為pid的程序

② pid = 0,傳送訊號給和當前程序號的程序同組的所有程序

③ pid = -1,廣播訊號給同系統內的所有程序

④ pid < 0,傳送訊號給程序組id為pid絕對值的所有程序

sig:相應的訊號

返回值:執行成功,返回0;執行失敗,返回-1。

(2)用raise函式傳送訊號給自身

函式原型:int  raise(int  sig);

標頭檔案:#include

引數:sig:相應的訊號

返回值:執行成功,返回0;執行失敗,返回-1。

6、對於上面的常用的兩種訊號的傳送方式,我們用下面的例子來說明一下:

#include #include #include #include #include int main()

if(pid == 0) //子程序執行

else //父程序執行

else}}

執行效果:

這裡子程序自己傳送停止程序執行訊號給自身,由於父程序沒有等到子程序退出,故立馬返回0並執行kill(pid,sigkll)語句,將子程序殺死。

7、其他訊號

(1)alarm函式

使用alarm函式可以設定乙個時間值(鬧鐘時間),當所設定的時間到了,產生sigalrm訊號。如果不捕捉此訊號,則預設動作是終止該程序

函式原型:unsigned  int  alarm(unsigned  int  seconds);

標頭檔案:#include

引數:設定的時間秒數

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

注意:每個程序只能有乙個鬧鐘時間.如果在呼叫alarm時,以前已為該程序設定過鬧鐘時間,而且它還沒有超時,以前登記的鬧鐘時間則被新值代換。

如果有以前登記的尚未超過的鬧鐘時間,而這次seconds值是0,則表示取消以前的鬧鐘。

#include #include #include void handle()  

int main()

}

上面程式在sleeping列印五次後會列印hello資訊,在5秒時獲得了鬧鐘訊號並執行了相應的訊號函式

(2)pause函式

作用:使呼叫程序掛起直至捕捉到乙個訊號

函式原型:int  pause(void);

標頭檔案:#include

返回值:只返回-1.

8、訊號的處理實現

當系統捕捉到某個訊號時,可以忽略該訊號或是使用指定的處理函式來處理該訊號,或者使用系統預設的方式

(1)signal函式

函式原型:void (*signal(int  signum,void(*handler)(int)))(int);

簡化原型:typedef void (*sighandler_t)(int)    sighandler_t;

原型變為: sighandler_t signal(int signum, sighandler_t handler);

作用:依照引數signum指定的訊號編號來設定該訊號的處理函式,當指定的訊號到達時就跳轉到引數handler指定的函式執行

標頭檔案:#include

返回值:返回先前訊號處理函式指標。

具體例子如下:(中斷訊號和退出訊號不可忽略)

#include #include #include void my_func(int sign_no) //自定義的訊號處理函式

if(sign_no == sigquit) //獲得退出訊號

}int main()

執行效果:

通過按中斷按鍵輸出訊號:ctrl + c

通過按退出按鍵輸出訊號:ctrl + \

Linux 程序間通訊 訊號

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...

Linux程序間通訊 訊號

1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...

Linux程序間通訊 訊號

訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...