先來簡單談談C語言中的信號(signal)
首先,signal是C語言庫中的函數,它實際上是軟中斷,也就是軟件發出的終端,本質來說,類似于int n
。
對于接收到該軟中斷信號的進程,就會停下手頭的工作,轉而去執行信號處理程序 signal handler。
對于這一點,是與硬件中斷的方式類似的。與硬件中斷類比學習會更容易!
因此,我們需要知道的是
- 有哪些可用的軟中斷:就像硬件的除法零中斷、溢出中斷、外設中斷…
- 軟中斷處理程序有哪些:就像中斷服務程序(位置信息在idt、ivt)
- 默認的軟中斷服務程序:系統啟動的時候就初始化默認的中斷服務程序
- 用戶自定義軟中斷服務程序:操作系統可自定義中斷服務程序
以及需要明白
- 中斷何時被觸發(觸發條件)
- 誰發出的中斷
- 誰接收的中斷
以上,都是抽象層次的理解,我們縷一縷過程
- 進程x執行
- 進程x觸發中斷 --> 發出軟中斷
- 進程y接收到中斷,進程x該干啥干啥
- 進程y停止當前的任務,轉而執行中斷服務程序
- 執行完成,進程y繼續執行自己的程序
至于進程x和y,可以的
- 同一進程
- 兩個進程
- 父進程與子進程
- 至于兩個獨立進程,先暫時不管,想做到這點至少得讓二者能夠通信
好,整體框架梳理好了,我們慢慢說。
有哪些信號
All signals in c/c++
上面的參考鏈接給出了所有的信號,現在我們簡單舉例說明。
Signal | Value | Description |
---|---|---|
SIGCHLD | 17 | Child status has changed (POSIX). Signal sent to parent process whenever one of its child processes terminates or stops.See the YoLinux.com Fork, exec, wait, waitpid tutorial |
SIGCHLD信號:父進程子進程
請看我的另一篇文章:信號量SIGCHLD的使用,如何讓父進程得知子進程執行結束,如何讓父進程區分多個子進程的結束
信號處理函數
參考:
[1] Signals in C language
[2] How to use signal handlers in C language?
信號處理函數有兩類
- 系統自帶的處理函數
- 用戶自定義函數
與底層硬件中斷是類似的,中斷向量表是自帶的,也允許用戶自定義。
關于中斷的默認處理以及自定義處理,鏈接也有了。
誰發出?誰接收?
- 發出者:操作系統,或者某進程
- 接收者:某進程
至于細節,取決于你使用了哪個信號。每個信號的發出和接收動作和對象,以及默認的處理函數,都是規定好了的。
如何執行?
這個不再提了…就那么幾個套路,很容易。
需要特別說明的是,如果進程1接收其他進程的信號X,在進程1執行信號x處理函數之前,如果多個信號x都發給了進程1,那么,這些信號可能被合并,進程1只執行1次信號處理函數。這可能的原因很多,比如操作系統很忙…
下面這篇參考鏈接我還沒有處理:
Handling multiple SIGCHLD