Linux 訊號及其使用簡單講解

2021-10-04 13:06:54 字數 1811 閱讀 4238

在學習訊號之前,我們先要知道,訊號與訊號量不是同乙個東西。訊號量主要是實現程序之間的同步與互斥,主要用於程序間通訊。

這就是乙個訊號,現實生活中訊號也特別常見。

訊號的作用

我們先想一下在現實生活中訊號主要是通知一件事情的,其實在作業系統中,訊號也扮演著這樣的角色。

在作業系統中,通知乙個程序發生某乙個事件,打斷當前程序的操作,去處理這個事件。軟體中斷

檢視訊號

程序在相應訊號之前必須先知道該訊號是什麼意思。

上面共62中訊號,其中沒有32,33訊號。

1-31號訊號:訊號有其對應的事件,非可靠訊號。

34-64號訊號:沒有對應的事件,可靠訊號。

可靠訊號與不可靠訊號最主要的區別就是可靠訊號不會丟失事件,不可靠訊號會丟失事件。

訊號的產生

訊號在程序中的註冊

讓程序知道自己收到了乙個訊號,程序就是乙個pcb,linux下在pcb結構體中定義了乙個訊號的集合set(位圖),若給程序傳送乙個訊號,則將這個訊號對應的位置的二進位制位置1。

位圖只能標記程序是否收到這個訊號,無法確定訊號收到多少次,所以在核心中其實還有乙個鍊錶。

sigset_t set;申請乙個set集合

sigemptyset(&set);清空乙個set集合,因為set集合為棧上申請的空間,所以會存在資料

int sigfillset(sigset_t *set);將所有訊號新增到set中

int sigaddset(sigset_t *set,int signum);將訊號值為signum新增到set中

訊號在程序中的登出

訊號的處理

程序在收到訊號之後,針對這個訊號的事件找到它對應的處理函式。

訊號處理方式的修改

自定義訊號的捕捉流程

訊號的處理:當前程序從使用者態切換到核心態之前進行處理。

程式從使用者態切換到核心態的方法:中斷,異常,系統呼叫。

訊號的阻塞

在程序中標記,哪個訊號註冊之後,暫時不去處理,知道訊號接觸阻塞。

阻塞乙個訊號被抵達,程序pcb中有乙個訊號block集合,使用者可以在這個集合中標記哪些訊號被阻塞。

本質:將訊號新增到block集合中,則表示這個訊號被阻塞,當訊號傳遞過來時,暫時不處理。

int sigprocmask(int how,const sigset_t *set,sigset_t *oldset

how:即將要對pcb中block集合所作的操作,有三個選項:

注意:1:訊號阻塞時依舊能夠進行訊號註冊,但是暫時不處理。

2:可靠訊號註冊多次,因此會阻塞處理多次,不可靠訊號只能被註冊一次,只阻塞處理一次。

3:9號訊號與19號訊號不能被阻塞。

#include

#include

#include

void

sigcb

(int signo)

intmain()

Linux下訊號的簡單使用

1,1個main,包含2個while,不要被兩個while中的sleep所迷惑,這裡只有main 這乙個主線程 程序 在執行,程式會按照自上而下順序執行。遇到第1個while迴圈中的sleep時,本執行緒暫停執行,交給其它執行緒處理,但是因為該程序只有乙個執行緒,所以只有靜靜的sleep到指定時間 ...

linux 各種訊號及其含義

名稱 預設動作 說明 sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程序 sigquit 建立core檔案 終止程序,並且生成core檔案 sigill 建立core檔案 非法指令 sigtrap 建立core檔案 跟蹤自陷 sigbus 建立core檔案 匯流排錯誤 sig...

Linux訊號捕捉及其處理

一 signal訊號處理機制 可以用函式signal註冊乙個訊號捕捉函式,其函式原型為 include typedef void sighandler t int sighandler t signal int signum,sighandler t handler 下面用乙個例子來介紹signal...