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 函式可以將任意訊號傳送給另乙個程序或程序組。接收訊號程序和傳送訊號程...