信号 09 | 信号概念
信號(hào)的概念
信號(hào)在我們的生活隨處可見,如:古代戰(zhàn)爭(zhēng)中摔杯為號(hào);代戰(zhàn)爭(zhēng)中的信號(hào)彈;體育比賽中使用的信號(hào)槍,它們都有共性:1. 簡(jiǎn)單 2. 不能攜帶大量的信息 3. 滿足某個(gè)特定條件才發(fā)送
信號(hào)是信息的載體,Linux/UNIX環(huán)境下,古老、經(jīng)典的通信方式,現(xiàn)在依然是主要的通信手段。
UNIX早期版本就提供了信號(hào)機(jī)制,但不可靠,信號(hào)可能丟失,Bakeley和AT&T都對(duì)信號(hào)模型做了更改,增加了可靠信號(hào)機(jī)制。但彼此不兼容。POSIX.1對(duì)可靠信號(hào)例程進(jìn)行了標(biāo)準(zhǔn)化。
?
信號(hào)的機(jī)制
A給B發(fā)送了信號(hào),B收到信號(hào)之前執(zhí)行自己的代碼,收到信號(hào)后,不管執(zhí)行到程序的什么位置,都要暫停運(yùn)行,去處理信號(hào),處理完畢再繼續(xù)執(zhí)行,與硬件中斷類似——異步模式,但信號(hào)是軟件層面上實(shí)現(xiàn)的中斷,早期常被稱“軟中斷”。
信號(hào)的特征:由于信號(hào)是通過軟件方法是是實(shí)現(xiàn),其實(shí)現(xiàn)手段導(dǎo)致信號(hào)有很強(qiáng)的延時(shí)性。但對(duì)于用戶來說,這個(gè)延遲時(shí)間非常短,不易察覺。
注意:每個(gè)進(jìn)程收到的所有信號(hào),都是由于內(nèi)核負(fù)責(zé)發(fā)送的,內(nèi)核處理。
?
與信號(hào)相關(guān)的事件與狀態(tài)
產(chǎn)生信號(hào):
- 按鍵產(chǎn)生:如Ctrl + c、Ctrl + z, Ctrl + \
- 系統(tǒng)調(diào)用產(chǎn)生:如kill、raise、alarm
- 硬件異常產(chǎn)生:如非法訪問內(nèi)存(段錯(cuò)誤)、除0(浮點(diǎn)數(shù)除外)、內(nèi)存對(duì)齊錯(cuò)誤(總線錯(cuò)誤)
遞達(dá):遞送并且到達(dá)進(jìn)程
未決:產(chǎn)生和遞達(dá)之間的狀態(tài)。主要由于阻塞(屏蔽)導(dǎo)致該狀態(tài)。
信號(hào)的處理方式:
- 執(zhí)行默認(rèn)動(dòng)作:默認(rèn)操作統(tǒng)通常是終止進(jìn)程,這取決于被發(fā)送的信號(hào)
- 忽略(丟棄):不采取任何操作、有兩個(gè)信號(hào)不能忽略:SIGKILL和SIGSTOP
- 捕捉(調(diào)用用戶處理函數(shù)):內(nèi)核中斷正在執(zhí)行的代碼,轉(zhuǎn)去執(zhí)行先前注冊(cè)過的處理程序
linux內(nèi)核的進(jìn)程控制塊PCB是一個(gè)結(jié)構(gòu)體,task_struct,除了包含進(jìn)程ID、狀態(tài)、工作目錄、用戶ID、組ID、文件描述符、還包含了信號(hào)相關(guān)的信息,主要指阻塞信號(hào)集和未決信號(hào)集。
阻塞信號(hào)集:將某些信號(hào)加入集和,對(duì)它們?cè)O(shè)置屏蔽屏蔽,當(dāng)屏蔽x信號(hào)后,在收到該信號(hào),該信號(hào)的處理退后(解除屏蔽后)
未決信號(hào)集:
- 信號(hào)產(chǎn)生,未決信號(hào)集中描述該信號(hào)的位立即翻轉(zhuǎn)為1, 表信號(hào)處于未決轉(zhuǎn)態(tài)。當(dāng)信號(hào)被處理翻轉(zhuǎn)回為0,這一時(shí)刻往往非常短暫。
- 信號(hào)的產(chǎn)生后由于默寫原因(主要指阻塞)不能抵達(dá),這類信號(hào)的集合稱之為未決信號(hào)集。在屏蔽解除前,信號(hào)一直處于未決狀態(tài)。
?
?
總結(jié)
以上是生活随笔為你收集整理的信号 09 | 信号概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue2.0+webpack 如何使用b
- 下一篇: 成都欢乐谷闭园时间