4.
名稱::
alarm
功能:set an alarm clock for delivery of a signal
標頭檔案:
#include
函式原形:
unsigned int alarm(unsigned int seconds);
引數:seconds 時間
返回值:
0或以前設定時間的剩餘數
使用alarm函式可以設定乙個時間值(鬧鐘時間),在將來的某個時刻時間值會被超過。當所設時間值被超過後,產生sigalrm訊號。如果不忽略或不捕捉此訊號,則其預設動作是終止該程序。
/*10_5.c*/
#include
#include
main()
下面這個函式會有什麼結果呢?
sigalrm的預設操作是結束程序,所以程式在1秒之後結束,你可以看看你的最後i值為多少,來比較一下大家的系統效能差異(我的是40300)。
5.名稱::
abort
功能:訊號傳送函式
標頭檔案:
#include
函式原形:
void abort(void);
引數:返回值:
無此函式將sigabrt訊號傳送給呼叫程序。程序不應該忽略此訊號。
三、可靠訊號安裝和傳送函式。
可靠訊號的處理函式和不可靠訊號的處理函式基本原理是一樣的,只不過是可靠訊號的處理函式支援排隊,訊號不會丟失。
6.名稱::
sigaction
功能:可靠訊號的安裝函式
標頭檔案:
#include
函式原形:
int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);
引數:返回值:
若成功返回0,若出錯返回-1。
sigaction結構的原形為:
struct sigaction
這個函式和結構看起來是不是有點恐怖呢。不要被這個嚇著了,其實這個函式的使用相當簡單的。我們先解釋一下各個引數的含義。 signo很簡單就是我們要處理的訊號了,可以是任何的合法的訊號。有兩個訊號不能夠使用(sigkill和sigstop)。 act包含我們要對這個訊號進行如何處理的資訊。oact更簡單了就是以前對這個函式的處理資訊了,主要用來儲存資訊的,一般用null就ok了。
訊號結構有點複雜。不要緊我們慢慢的學習。
sa_handler是乙個函式型指標,這個指標指向乙個函式,這個函式有乙個引數。這個函式就是我們要進行的訊號操作的函式。 sa_sigaction,sa_restore和sa_handler差不多的,只是引數不同罷了。這兩個元素我們很少使用,就不管了。
sa_flags用來設定訊號操作的各個情況。一般設定為0好了。sa_mask用來設定訊號遮蔽字,將在後面介紹。
在使用的時候我們用sa_handler指向我們的乙個訊號操作函式,就可以了。sa_handler有兩個特殊的值:sig_del和sig_ign。sig_del是使用預設的訊號操作函式,而sig_ign是使用忽略該訊號的操作函式。
這個函式複雜,我們使用乙個例項來說明。下面這個函式可以捕捉使用者的ctrl+c訊號。並輸出乙個提示語句。
/*10_6.c*/
#include
#include
#define prompt "catch the signal of 『ctrl+c』\nplease enter 『ctrl+z』 to exit\n"
char *prompt=prompt;
void ctrl_c_op(int signo) /*訊號處理程式*/
int main()
while(1);
}執行程式後,當使用者按ctrl+c(會產生sigint訊號)後螢幕上會列印。
catch the signal of 『ctrl+c』
please enter 『ctrl+z』 to exit
也就是說當使用者按ctrl+c時我們呼叫我們自己寫的函式來處理中斷。
7.名稱::
sigqueue
功能:可靠訊號的傳送函式
標頭檔案:
#include
函式原形:
int sigqueue(pid_t pid,int sig,const union sigval value);
引數:返回值:
若成功返回0,若出錯返回-1。
typedef union sigval
sigval_t;
sigqueue()是比較新的傳送訊號系統呼叫,主要是針對實時訊號提出的(當然也支援前32種),支援訊號帶有引數,與函式sigaction()配合使用。sigqueue的第乙個引數是指定接收訊號的程序id,第二個引數確定即將傳送的訊號,第三個引數是乙個聯合資料結構union sigval,指定了訊號傳遞的引數,即通常所說的4位元組值。
sigqueue()比kill()傳遞了更多的附加資訊,但sigqueue()只能向乙個程序傳送訊號,而不能傳送訊號給乙個程序組。如果sig為0,將會執行錯誤檢查,但實際上不傳送任何訊號,0值訊號可用於檢查pid的有效性以及當前程序是否有許可權向目標程序傳送訊號。
在呼叫sigqueue時,sigval_t指定的資訊會拷貝到3引數訊號處理函式的siginfo_t結構中,這樣訊號處理函式就可以處理這些資訊了。由於sigqueue系統呼叫支援傳送帶引數訊號,所以比kill()系統呼叫的功能要靈活和強大得多。
注:sigqueue()傳送非實時訊號時,第三個引數包含的資訊仍然能夠傳遞給訊號處理函式; sigqueue()傳送非實時訊號時,仍然不支援排隊,即在訊號處理函式執行過程中到來的所有相同訊號,都被合併為乙個訊號。
unix 環境高階程式設計 讀書筆記
unix環境高階程式設計 讀書筆記 第8章exit和 exit區別 exit會直接進入核心,不會關閉io流。程序基本控制函式還有 wait,fork,exec。atexit 程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能 註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構...
unix環境高階程式設計 讀書筆記
檔案 unix支援在不同程序之間共享開啟的檔案。核心使用三種資料結構表示開啟的檔案 原子操作 一般而言,原子操作指的是由多步組成的操作。如果該操作原子的執行,要麼執行完所有步,要麼一步也不執行,不可能只執行所有步驟的乙個子集。2 注意 原子操作函式 pread,pwrite pread 相當於呼叫r...
Unix環境高階程式設計 讀書筆記一
unix 基礎知識 這一章主要是unix系統的概論以及一些概念的介紹,主要分為10個小節 1 登陸 2 檔案和目錄 3 輸入和輸出 4 程式和程序 5 ansi c 6 出錯處理 7 使用者標識 8 訊號 9 unix時間值 10 系統呼叫和庫函式 這個都比較簡單,就不再重複敘述了。在標頭檔案中定義...