1.訊號全稱軟中斷訊號,其本質是軟體層次上對中斷機制的一種模擬,用於提醒程序某件事情已經發生。
2.訊號被應用於程序間通訊,但它實際並不由程序傳送,在遇到某種情況時,核心會傳送某個訊號到某個程序。
3.通常產生訊號的情況有以下5種:
1)使用者在終端輸入某些組合按鍵時
,終端會通知核心產生乙個訊號,之後核心將該訊號傳送到相應程序。
2)硬體檢測到異常時,如段錯誤、除0(浮點數除外)、匯流排錯誤等異常,核心會產生訊號並傳送訊號到正在執行的程序。
3)滿足某種軟體條件時核心也會產生訊號,例如alarm計時器計時結束時會傳送26號訊號到正在執行的程序。
4)使用者程序可以在程式中通過系統呼叫
kill、raise、absort等,傳送指定訊號給指定程序或程序組。
5)使用者在shell命令列
中可以使用kill命令向指定程序傳送訊號。
4.訊號的處理方式有三種:忽略、捕獲和執行預設動作。這裡主要來講一下執行預設動作。訊號的預設動作有5個:term(終止程序),ign(忽略訊號),core(終止程序並生成core檔案),stop(暫停程序),cont(繼續執行程序)。不同事件發生時,訊號會被傳送給相對應的程序,每個程序對應的事件以及程序接收到訊號後的預設動作如下(截至請見黑馬程式設計師《linux程式設計基礎》p155):
5.kill () 函式宣告為int kill (pid_t pid, int sig);
。它有兩個引數: pid 表示接收訊號的程序的p id, sig 表示要傳送的訊號的編號。引數pid 的不同取值會影響kll()函式作用的程序,其取值可分為4 種情況,每種取值代表的含義分別如下:
• 若pid> 0則傳送訊號sig 給程序號為pid 的程序。
• 若pid=0, 則傳送訊號sig 給當前程序所屬組中的所有程序。
• 若pid=-1, 則傳送訊號sig 給除1 號程序與當前程序外的所有程序。
• 若pid
6.可以根據kill 0 函式的返回值來判斷使用者程序是否有許可權向另外乙個程序傳送訊號:
• 若返回值為o, 表示kill () 函式成功呼叫,當前程序有許可權。
• 若返回值為-1, 且errno 為esrch, 表明指定接收訊號的程序不存在; 否則表示當前程序沒有許可權。
函式名呼叫成功
呼叫失敗
kill0-1
raise0非零
pause無-1
8.對程序來說,若訊號的傳送過於密集,即在處理訊號的同時再次收到訊號,那麼程序會將後到的訊號丟棄。
9.pcb:為了描述控制程序的執行,系統中存放程序的管理和控制資訊的資料結構稱為程序控制塊(pcb,process control block),它是程序實體的一部分,是作業系統中最重要的記錄性資料結構。它是程序管理和控制的最重要資料結構,每乙個程序均有乙個pcb,在建立程序時,pcb也會隨之被建立,他會伴隨程序執行的全過程,直到程序撤銷而撤銷
10.訊號遮蔽機制:訊號遮蔽機制的實現依賴於程序的pcb。pcb中有兩個訊號集(它們都是點陣圖,每乙個都對應乙個訊號),分別是訊號掩碼(signal mask)和未決訊號集(signal pending)。若某訊號對應的位被設定位1,訊號會被遮蔽,進入阻塞狀態。然後核心會修改pending中該訊號對應的位為1,使該訊號處於未決態。除非此後該訊號被解除遮蔽,否則核心不會向程序傳送這個訊號。
11.檢視系統中所有程序:ps aux
:
12.在linux中編譯和訊號處理有關的程式時,用-std=c99顯示sigset_t沒有定義,因為在c標準中sigset_t
並不是中的一部分,要在編譯時使用-d_gnu_source
選項,它表示**符合gnu標準。原文在此。
13.用kill命令向程序傳送訊號時,注意訊號需要在編號前加個短橫槓-
,比如:
14.在父程序中呼叫wait(0)相當於等待子程序結束
15.關於時序競態的乙個例子:
//時序競態
#include #include #include void sig_alrm(int signo)
unsigned int mysleep(unsigned int nsecs)
int main(void)
return 0;
}
python知識點(六)系統程式設計
一 系統模組 1 sys 提供一組功能對映python執行時的系統操作 2 os 提供跨平台可移植的作業系統程式設計介面 os.path 提供檔案及目錄工具的可移植程式設計介面 二 sys 1 平台與版本 sys.platform 執行平台版本 sys.version 執行編譯器版本 sys.pat...
Linux系統程式設計 訊號
0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...
Linux系統程式設計 訊號
基本概念 訊號的狀態 產生未決狀態 沒有被處理的 遞達 已經被處理的 訊號的優先順序比較高 程序收到訊號之後,暫停正在處理的工作 訊號集 kill 發射訊號給某個程序 raise 自己給自己發訊號 函式原型 int raise int sig abort 給自己傳送異常終止的訊號 alarm 設定定...