我們在 linux程序訊號1中學習了什麼是程序訊號,訊號如何產生等,今天我們繼續學習一些關於程序訊號相關的知識
訊號相關的其他常見概念
訊號在核心中的表示
訊號集操作函式我們前面一直提訊號的捕捉或者遞達這一概念,那麼在作業系統中到底是什麼時候進行訊號的捕捉呢?我們依舊使用一張圖來表達我們的流程:
核心如何實現訊號的捕捉
此函式有兩個引數,第乙個引數sig為要設定的訊號,第二個引數為接收到此訊號後你所要執行的函式的函式指標,第二個引數還給我們了三個巨集的選擇
1.sig_err //返回錯誤
2.sig_dfl //執行訊號預設操作
3.sig_ign //忽略訊號
如果執行成功,此函式返回上一次對此訊號的設定,如果設定多次,最終者為最近設定的一次,如果設定失敗,將返回sig_err的錯誤。話不多說,我們一起來用用這個函式。
**非常簡單,相信你仔細看一定看的懂,handler的引數就是我們捕獲到的信號碼,這裡要說的是,2號訊號實際上就是我們按ctrl + c 給程序傳送的訊號,原來缺省會讓程序終止,現在我們讓他執行我們自定義的行為列印handler函式中的句子。(無法終止程序的同學按ctrl + z即可)
signal訊號安裝函式很簡單,他只能提供簡單的訊號安裝操作,所以逐步被淘汰,因此linux提供了功能更強大的sigaction函式
struct sigaction
對了,別忘了我們要呼叫sa_sigaction時與他配合的sa_flags,這裡我們來看幾個常用的選項:
現在了解了更多,不妨這次我們使用sa_sigaction成員試試看:
想必講到這大家應該也基本上了解了signal和sigaction兩個函式的使用了,其實不難理解。
我們剛剛在訊號捕捉中講到的signal函式嗎,它就是乙個可重入函式,也就代表他是乙個不可靠的訊號函式。
因此這也就是為什麼signal函式逐漸被淘汰的原因,而sigaction則不會出現這種情況。
不可重入函式
程序訊號(2)
理解訊號遞達和阻塞的概念和原理 首先我們看一下什麼是阻塞訊號?阻塞訊號 1 訊號其他相關概念 實際執行訊號的處理動作稱為訊號遞達 delivery 訊號遞達有三種方式 1 忽略 2 預設動作 3 自定義捕捉 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個...
linux linux程序指令
1.linux有哪些程序 linux下的主要程序狀態有 2.1 r task running 可執行狀態 通過將程序的task struct結構放到cpu的可執行佇列中,使程序變成r態。只有處在該狀態的程序才有可能被程序排程器選中在cpu上執行 2.2 s task interruptible 可中...
linux linux程序記憶體分析
在產品的開發中,通過對當前系統消耗記憶體總量的統計,可以對產品所需記憶體總量進行精確的評估,從而選擇合適的記憶體晶元與大小,降低產品的成本。在遇到記憶體洩露類問題時,經常會對此束手無策,本文通過對proc下程序相關的檔案進行分析,精確評估系統消耗記憶體的大小,還可以對記憶體洩露類問題的解決提供一種定...