C语言中信号函数(signal)的使用
先來(lái)簡(jiǎn)單談?wù)凜語(yǔ)言中的信號(hào)(signal)
首先,signal是C語(yǔ)言庫(kù)中的函數(shù),它實(shí)際上是軟中斷,也就是軟件發(fā)出的終端,本質(zhì)來(lái)說(shuō),類似于int n。
對(duì)于接收到該軟中斷信號(hào)的進(jìn)程,就會(huì)停下手頭的工作,轉(zhuǎn)而去執(zhí)行信號(hào)處理程序 signal handler。
對(duì)于這一點(diǎn),是與硬件中斷的方式類似的。與硬件中斷類比學(xué)習(xí)會(huì)更容易!
因此,我們需要知道的是
- 有哪些可用的軟中斷:就像硬件的除法零中斷、溢出中斷、外設(shè)中斷…
- 軟中斷處理程序有哪些:就像中斷服務(wù)程序(位置信息在idt、ivt)
- 默認(rèn)的軟中斷服務(wù)程序:系統(tǒng)啟動(dòng)的時(shí)候就初始化默認(rèn)的中斷服務(wù)程序
- 用戶自定義軟中斷服務(wù)程序:操作系統(tǒng)可自定義中斷服務(wù)程序
以及需要明白
- 中斷何時(shí)被觸發(fā)(觸發(fā)條件)
- 誰(shuí)發(fā)出的中斷
- 誰(shuí)接收的中斷
以上,都是抽象層次的理解,我們縷一縷過(guò)程
至于進(jìn)程x和y,可以的
- 同一進(jìn)程
- 兩個(gè)進(jìn)程
- 父進(jìn)程與子進(jìn)程
- 至于兩個(gè)獨(dú)立進(jìn)程,先暫時(shí)不管,想做到這點(diǎn)至少得讓二者能夠通信
好,整體框架梳理好了,我們慢慢說(shuō)。
有哪些信號(hào)
All signals in c/c++
上面的參考鏈接給出了所有的信號(hào),現(xiàn)在我們簡(jiǎn)單舉例說(shuō)明。
| 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信號(hào):父進(jìn)程子進(jìn)程
請(qǐng)看我的另一篇文章:信號(hào)量SIGCHLD的使用,如何讓父進(jìn)程得知子進(jìn)程執(zhí)行結(jié)束,如何讓父進(jìn)程區(qū)分多個(gè)子進(jìn)程的結(jié)束
信號(hào)處理函數(shù)
參考:
[1] Signals in C language
[2] How to use signal handlers in C language?
信號(hào)處理函數(shù)有兩類
- 系統(tǒng)自帶的處理函數(shù)
- 用戶自定義函數(shù)
與底層硬件中斷是類似的,中斷向量表是自帶的,也允許用戶自定義。
關(guān)于中斷的默認(rèn)處理以及自定義處理,鏈接也有了。
誰(shuí)發(fā)出?誰(shuí)接收?
- 發(fā)出者:操作系統(tǒng),或者某進(jìn)程
- 接收者:某進(jìn)程
至于細(xì)節(jié),取決于你使用了哪個(gè)信號(hào)。每個(gè)信號(hào)的發(fā)出和接收動(dòng)作和對(duì)象,以及默認(rèn)的處理函數(shù),都是規(guī)定好了的。
如何執(zhí)行?
這個(gè)不再提了…就那么幾個(gè)套路,很容易。
需要特別說(shuō)明的是,如果進(jìn)程1接收其他進(jìn)程的信號(hào)X,在進(jìn)程1執(zhí)行信號(hào)x處理函數(shù)之前,如果多個(gè)信號(hào)x都發(fā)給了進(jìn)程1,那么,這些信號(hào)可能被合并,進(jìn)程1只執(zhí)行1次信號(hào)處理函數(shù)。這可能的原因很多,比如操作系統(tǒng)很忙…
下面這篇參考鏈接我還沒(méi)有處理:
Handling multiple SIGCHLD
總結(jié)
以上是生活随笔為你收集整理的C语言中信号函数(signal)的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gdb tui的使用
- 下一篇: fork创建多个子进程