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

2021-04-19 18:19:40 字數 3505 閱讀 9065

二、不可靠訊號安裝和傳送函式。

1.

名稱::signal

功能:訊號安裝(設定訊號關聯動作)

標頭檔案:

#include

函式原形:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum,sighandler_t handler);

引數:signum

訊號名handler

操作方式

返回值:

成功則為以前的訊號處理配置,若出錯則為

sig_err

signum

引數是訊號名,

handler

的值是:

1。常數

sig_ign

:表示忽略此訊號。2。

sig_dfl

:表示接到此訊號後的動作是系統預設動作。

3signal

設定訊號處理程式時,第二個引數是指向該函式的指標。

/*10_1.c*/

#include

#include

#include

main()

上面的**忽略了

sinint訊號.

此程式執行會在螢幕上先列印乙個「

hello!」,

然後睡眠

10分鐘。在此期間使用者按

ctrl+c

沒有任何反應,因為

signal

函式已將

sigint

訊號(按

ctrl+c

會產生)設為忽略。

然後看下面的程式:

/*10_2.c*/

#include

#include

#include

void catch(int sig);

main()

void catch(int sig)

當使用者按下

ctrl+c時,

程序被中斷

,catch()

被執行.

中斷處理函式處理完畢後

,轉回斷點執行下面的指令

. 當編寫自己的中斷處理函式時

,注意下面兩點:

1.訊號不能打斷系統呼叫

. 2.

訊號不能打斷訊號處理函式.

2.名稱:

:pause

功能:等待訊號

標頭檔案:

#include

函式原形:

int pause(void);

引數:無

返回值:-1,

errno

設定為eintr

pause

函式使呼叫程序掛起直至捕捉到乙個訊號,

pause

才返回。在這種情況下,

pause

返回-1

,errno

設定為eintr..

下面是乙個例子:

/*10_3.c*/

#include

static void sig_usr(int signo);

int main()

static void sig_usr(int signo)

pause();

函式使呼叫程序掛起,直至捕捉到乙個訊號。

下面我們來執行一下:

#./10_1 &

在後台執行程序

[3] 18864

#.kill -usr1 18864

向該程序傳送

sigusr1

received sigusr1

# kill –usr2 18864

向該程序傳送

sigusr1

received sigusr2

# kill 18864

向該程序傳送

sigterm

[3]+ terminated./signal

可以看到當使用者

kill -usr1 18864

的時候產生了

sigusr1

訊號,signal

定義了處理此訊號要呼叫

sig_usr

函式,所以就在螢幕上列印出

received sigusr1

。shell

自動將後台程序對中斷和退出訊號的處理方式設定為忽略。於是當按中斷鍵時就不會影響到後台程序。如果沒有執行這樣的處理,那麼當按中斷鍵時,它不但會終止前台程序,還會終止所以的後台程序。

我們還應注意的是,我們不能在訊號處理程式中呼叫某些函式,這些函式被稱為不可重入函式,例如

malloc,getpwnam..

那是因為當發生中斷的時候系統有可能正在執行這些函式,在中斷中呼叫這些函式可能會覆蓋原來的資訊,因而產生錯誤。

3.名稱::

kill/raise

功能:訊號傳送函式

標頭檔案:

#include

函式原形:

int kill(pid_t pid,int signo);

int raise(int signo);

引數:pid

程序id

signo

訊號返回值:

若成功返回

0,若出錯返回-1

kill

函式將訊號傳送給程序或程序組。

raise

函式則允許程序向自己傳送訊號。

raise(signo)

等價於kill(getpid(),signo);

kill

的pid

函式有4

種不同的情況:

pid>0

將訊號傳送給程序id為

pid的程序。

pid==0

將訊號傳送給與傳送程序同一組的所有程序。

pid<0

將該訊號傳送給其程序組

id等於

pid絕對值。

pid==-1

將訊號傳送給程序有權向它傳送訊號的系統上的所有程序。

程序將訊號傳送給其他程序需要許可權。超級使用者可將訊號傳送另乙個程序。對於非超級使用者,其基本規則是傳送者的實際或有效使用者

id必須等於接收者的實際或有效使用者id。

/*10_4.c*/

#include

#include

void sig_usr(int);

main()

void sig_usr(int signo)

程式執行後,當使用者按

ctrl+c

後,程式呼叫訊號處理函式輸出

received sigint

,然後呼叫

kill

函式中止程序。此程式的

kill(getpid(),sigkill);

也可以寫成

raise(sigkill);.

文章**:http://blog.chinaunix.net/u1/59291/showart.php?id=538590

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