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