《unix高階環境程式設計》訊號 訊號傳送與捕獲

2021-06-27 06:04:56 字數 2357 閱讀 1750

kill 函式是將訊號傳送給程序或程序組,raise 函式是將訊號傳送給自身,他們定義及說明如下所示:

[cpp]view plain

copy

/* 訊號傳送與捕獲 */

/** 函式功能:將訊號傳送給程序或程序組;

* 返回值:若成功則返回0,若出錯則返回-1;

* 函式原型:

*/#include 

intkill(pid_t pid, 

intsigno);  

/*說明:

* signo 是訊號型別;

* pid有以下四種情況:

* (1)、pid >0,將該訊號signo傳送給程序id為pid的程序;

* (2)、pid ==0,將該訊號signo傳送給與傳送程序屬於同一程序組的所有程序,

*             而且傳送程序具有向這些程序發訊號的許可權;

* (3)、pid <0,將該訊號signo傳送給其程序組id等於pid絕對值,而且傳送程序具有

*            其所傳送訊號的許可權;

* (4)、pid ==-1,將該訊號signo傳送給傳送程序有許可權向他們傳送訊號的系統上的所有程序;

*//*

* 函式功能:向程序自身傳送訊號;

* 返回值:若成功則返回0,若出錯則返回-1;

* 函式原型:

*/int

raise(

intsigno);  

/** raise(signo)等價於kill(getpid(),signo);*/

超級使用者可以將訊號傳送給任一程序,對於非超級使用者,其基本規則是傳送者的實際或者有效使用者id必須等於接受者的實際或者有效使用者id。但也有乙個特例:如果被傳送的訊號是 sigcont,則程序可以將它傳送給屬於同一會話的任何程序。

如果 signo 引數為 0(posix.1將其定義為空訊號),kill 仍執行正常的錯誤檢查,但不傳送訊號。這常被用來檢測某一程序是否存在。如果向乙個不存在的程序傳送訊號,則 kill 返回 -1,並將 errno 設定為 esrch。但是,unix系統在經過一段時間後會重新使用程序id,所以乙個現有的具有所給定程序id的程序可能並不是你真正想檢測的程序。

使用 alarm 函式可以設定乙個計時器,在將來某個指定的時間該計時器會超時。當計時器超時時,產生sigalrm訊號,如果不忽略或捕捉此訊號,則其預設動作是終止呼叫該 alarm 函式的程序。每個程序只能有乙個鬧鐘。如果在呼叫alarm 時,已經為該程序設定過鬧鐘,而且它還沒有超時,則將該鬧鐘的剩餘時間值作為本次alarm 呼叫的返回值。以前的鬧鐘則被新值代替。

pause 函式使呼叫程序掛起直到捕捉到乙個訊號。只有執行乙個訊號處理程式並從中返回時,pause 才返回。

[cpp]view plain

copy

/** 函式功能:設定程序的鬧鐘時間;

* 返回值:0或以前設定的鬧鐘時間餘留的秒數;

* 函式原型:

*/#include 

unsigned int

alarm(unsigned 

intseconds);  

/** 說明:

* 引數seconds是秒數,經過指定的秒數seconds後會產生訊號sigalrm;

* 若程序之前登記過的鬧鐘尚未超過鬧鐘時間,而且本次seconds為0時,

* 則取消之前的鬧鐘時鐘,其餘留值仍作為alarm函式的返回值;

*/int

pause(

void

);//使呼叫程序掛起直到捕獲到乙個訊號;

/** 只有執行了乙個訊號處理程式並從其返回時,pause才返回;

* 在這種情況下,pause返回-1,並將errno設定為eintr;*/

程式測試:

[cpp]view plain

copy

#include "apue.h"

#include 

#include 

static

void

sig_alarm(

intsigno)  

static

void

sig_kill(

intsigno)  

intmain(

void

)    

輸出結果:

[cpp]view plain

copy

kill()  

recevied kill.  

alarm()  

pause.  

recevied alarm.  

raise().  

hangup  

unix環境高階程式設計 訊號(2)

函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...

Unix環境高階程式設計 九 訊號

訊號時軟中斷,很多比較重要的應用程式都需要處理訊號,訊號提供了一種處理非同步事件的方法。每個訊號都乙個名字,以sig開頭,在標頭檔案中定義訊號型別,都是正整數 訊號編號 產生訊號的條件 1 當使用者按某些終端鍵時,引發終端產生的訊號。2 硬體異常產生訊號。3 程序呼叫kill函式將訊號傳送給另外乙個...

訊號概念(UNIX環境高階程式設計筆記)

每個訊號都有乙個名字。這些名字都以3個字元sig開頭。不存在編號為0的訊號。以下條件都可以產生訊號 當使用者按下某些終端鍵時,引發終端產生的訊號。如sigint。硬體異常產生訊號 除數為0 無效的記憶體引用等。程序呼叫kill 2 函式可以將任意訊號傳送給另乙個程序或程序組。接收訊號程序和傳送訊號程...