第10章 訊號
10.1 引言
*訊號是軟體中斷。訊號提供了一種處理非同步事件的方法
10.2 訊號概念
*每個訊號都有乙個名字。這些名字都以三個字元sig開頭
*在標頭檔案中,這些訊號被定義為正整數(訊號編號)
*不存在編號為0的訊號。kill函式對訊號編號0有特殊的應用。此種訊號編號值被稱為空訊號
10.3 signal函式
*程式啟動:當執行乙個程式時,所有訊號的狀態都是系統預設或忽略。通常所有訊號都設定為它們的預設動作,除非呼叫exec的程序忽略該訊號
*程序建立:當乙個程序呼叫fork時,其子程序繼承父程序的訊號處理方式。因為子程序在開始時複製了父程序的儲存映像,所以訊號捕捉函式的位址在子程序中是有意義的。
10.4不可靠的訊號
*訊號的不可靠指的是,訊號可能會丟失:乙個程序發生了,但程序卻可能一直不知道這一點。同時,程序對訊號的控制能力差。
10.5 中斷的系統呼叫
*系統呼叫分成兩類:低速系統呼叫和其他系統呼叫。低速系統呼叫是可能會使程序永遠阻塞的一類系統呼叫
10.6 可重入函式
*函式被訊號中斷後不可重入的原因:
(a) 已知它們使用靜態資料結構
(b) 它們呼叫malloc或free
(c) 它們是標準i/o函式。標準i/o庫的很多實現都以不可重入的方式使用全域性資料結構
10.7 sigcld語義
*對於sigcld的早期處理方式如下:
(1)如果程序特地設定該訊號的配置為sig_ign,則呼叫程序的子程序將不產生僵死程序
(2)如果將sigcld的配置設定為捕捉,則核心立即檢查是否有子程序準備好被等待,如果是這樣,則呼叫sigcld處理程式
10.8 可靠訊號術語和含義
*當引發訊號的事件發生時,為程序產生了乙個訊號(或向程序傳送乙個訊號)
*當對訊號採取了某種動作時,我們說向程序遞送了乙個訊號
*在訊號產生(generation)和遞送(delivery)之間的時間間隔內,稱訊號是未決的(pending)
*程序可以選用訊號遞送阻塞
10.9 kill和raise函式
*kill函式將訊號傳送給程序或程序組
*raise函式則允許程序向自身傳送訊號
10.10 alarm和pause函式
*使用alarm函式可以設定乙個計時器,在將來某個指定的時間該計時器會超時。
*當計時器超時時,產生sigalrm訊號。如果不忽略或不捕捉此訊號,則其預設動作時終止呼叫該alarm函式的程序
*pause函式使呼叫程序掛起直至捕捉到乙個訊號
10.11 訊號集
*訊號集(signal set)資料型別能表示多個訊號
*訊號種類數目可能超過乙個整型量所包含的位數,所以一般而言,不能用整型量中的一位代表一種訊號,也就是不能用乙個整型量表示訊號集
10.12 sigprocmask函式
*乙個訊號遮蔽字規定了當前阻塞而不能遞送給該程序的訊號集
*呼叫sigprocmask可以檢測或更改其訊號遮蔽字,或者在乙個步驟中同時執行這兩個操作
10.13 sigpending函式
*sigpending函式返回訊號集,其中的各個訊號對於呼叫程序是阻塞的而不能遞送,因而也一定是當前未決的
10.14 sigaction函式
*sigaction函式的功能是檢查或修改於指定訊號相關聯的處理動作(或同時執行這兩種操作)
10.15 sigsetjmp和siglongjmp函式
*在訊號處理程式中進行非區域性轉移時應當使用sigsetjmp和siglongjmp函式
10.16 sigsuspend函式
*sigsuspend函式的功能是在乙個原子操作中先恢復訊號遮蔽字,然後使程序休眠
*在捕捉到乙個訊號或發生了乙個會終止該程序的訊號之前,該程序被掛起
10.17 abort函式
*abort函式的功能是使異常程式終止
*abort函式將sigabrt訊號傳送給呼叫程序(程序不應忽略此訊號)
*iso c規定,呼叫abort講向主機環境遞送乙個未成功終止的通知,其方法是呼叫raise(sigabrt)函式
10.18 system函式
*posix.1要求system忽略sigint和sigquit,阻塞sigchld
*注意system的返回值,它是shell的終止狀態,但shell的終止狀態並不總是執行命令字串程序的終止狀態
10.19 sleep函式
*sleep函式使呼叫程序被掛起,直到滿足以下條件之一:
(1)已經過了seconds所指定的牆上時鐘時間
(2)呼叫程序捕捉到乙個訊號並從訊號處理程式返回
10.20 作業控制訊號
*6個訊號與作業控制有關:
sigchld 子程序已停止或終止
sigcont 如果程序已停止,則使其繼續執行
sigstop 停止訊號(不能**捉或忽略)
sigtstp 互動式停止訊號
sigttin 後台程序組成員讀控制終端
sigttou 後台程序組成員寫到控制終端
10.21 其他特徵
*某些系統提供陣列extern char *sys_siglist;陣列下標是訊號編號,給出乙個指向訊號字串名字的指標
*sig2str函式將給定訊號編號翻譯成字串
*str2sig函式將給出的名字翻譯成訊號編號
APUE讀書筆記 第14章 高階I O
14.1 引言 高階i o包括非阻塞i o 記錄鎖 系統v流機制 i o多路轉換 select和poll函式 readv和writev函式以及儲存對映i o mmap 14.2 非阻塞i o 非阻塞i o使我們可以呼叫open read和write這樣的i o操作,並使這些操作不會永遠阻塞 14.3...
APUE筆記之10章 訊號
訊號是軟體中斷。訊號提供非同步事件處理方法。早期的訊號模型 不可靠,訊號可能丟失。posix.1對可靠訊號例程進行了標準化。呼叫kill 2 函式可將任意訊號傳送給另乙個程序或程序組,但有限制 當某個訊號出現時,核心有3種處理方式 忽略 有2種訊號不能被忽略 sigkill 和 sigstop,原因...
APUE讀書筆記 第9章 程序關係
第9章 程序關係 9.1 引言 每個程序都有乙個父程序 初始的核心程序並無父程序,也可以說其父程序就是它自己 當子程序終止時,父程序得到通知並能取得子程序的退出狀態 9.2 終端登入 終端可以是基於字元的終端 簡單的基於字元終端的圖形終端,或者是執行視窗系統的圖形終端 系統管理員建立通常名為 etc...