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 系統呼叫和庫函式 這個都比較簡單,就不再重複敘述了。在標頭檔案中定義...