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

2021-06-15 00:16:05 字數 2816 閱讀 7737

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