UNIX環境高階程式設計讀書筆記(十) 訊號 (3)

2021-04-30 07:49:11 字數 3238 閱讀 6836

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