溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux進(jìn)程信號(hào)通信實(shí)例分析

發(fā)布時(shí)間:2022-01-12 15:06:15 來(lái)源:億速云 閱讀:140 作者:iii 欄目:互聯(lián)網(wǎng)科技

今天小編給大家分享一下linux進(jìn)程信號(hào)通信實(shí)例分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

在iTOP4412開(kāi)發(fā)板運(yùn)行中,當(dāng)我們?cè)趙in上遇到一個(gè)沒(méi)有辦法正常關(guān)閉的軟件的時(shí)候,我們可以打開(kāi)任務(wù)管理器,強(qiáng)制結(jié)束這個(gè)進(jìn)程,同理。在linux上也有類似的功能,比如從終端敲入ctrl+c組合鍵來(lái)產(chǎn)生一個(gè)信號(hào),當(dāng)運(yùn)行中的進(jìn)程捕捉到這個(gè)信號(hào)后就會(huì)做出反應(yīng)。

我們?cè)趙in上可以使用快捷鍵進(jìn)入任務(wù)管理器,那么linux中會(huì)在哪些情況下會(huì)產(chǎn)生信號(hào)呢?

linux進(jìn)程信號(hào)通信實(shí)例分析

那么linux有多少種信號(hào)呢,我們可以通過(guò)命令kill命令來(lái)查看

我們可以發(fā)現(xiàn),一共有64種信號(hào),每個(gè)信號(hào)都是以sig開(kāi)頭,信號(hào)的名稱是在signal.h中定義的。

第一部分:信號(hào)的發(fā)送

我們通過(guò)一個(gè)小例子來(lái)認(rèn)識(shí)下信號(hào)的發(fā)送:

linux進(jìn)程信號(hào)通信實(shí)例分析

這個(gè)程序主要用到了kill函數(shù), 因?yàn)橛脩艨臻g是不具備發(fā)送信號(hào)的能力的,只有內(nèi)核才可以發(fā)信號(hào),內(nèi)核有那么多信號(hào),我們要發(fā)哪個(gè)信號(hào),并且發(fā)給誰(shuí)呢?那么我們就需要先告訴內(nèi)核進(jìn)程PID,信號(hào)ID是多少,kill函數(shù)就幫我們解決了這個(gè)問(wèn)題,函數(shù)原型:

linux進(jìn)程信號(hào)通信實(shí)例分析

編譯并運(yùn)行:

linux進(jìn)程信號(hào)通信實(shí)例分析

從kill和raise的函數(shù)原型上看,raise沒(méi)有pid這個(gè)參數(shù),所以raise是可以通過(guò)kill來(lái)實(shí)現(xiàn)的。等價(jià)于:

linux進(jìn)程信號(hào)通信實(shí)例分析

第一部分信號(hào)發(fā)送總結(jié):

用戶空間不能發(fā)送信號(hào),是通過(guò)系統(tǒng)調(diào)用函數(shù)告訴內(nèi)核發(fā)什么信號(hào),發(fā)給誰(shuí),讓內(nèi)核來(lái)發(fā)送的,只有內(nèi)核才可以發(fā)信號(hào)。可以使用kill,raise,alarm函數(shù)來(lái)讓內(nèi)核發(fā)送信號(hào)。

第二部分信號(hào)接收

我們可以使用pause來(lái)接收信號(hào),pause函數(shù)使該進(jìn)程暫停讓出CPU。我們來(lái)看下下面這個(gè)例子,當(dāng)我們?cè)阪I盤上按下ctrl+c的時(shí)候,程序收到SIGINT信號(hào)會(huì)被喚醒,然后執(zhí)行fun函數(shù),處理完之后再返回繼續(xù)運(yùn)行該程序,不按則只打印process start(進(jìn)入睡眠狀態(tài))。

linux進(jìn)程信號(hào)通信實(shí)例分析

第三部分信號(hào)處理

信號(hào)的處理有三種方式,分別為:1,忽略,就是收到信號(hào)后,什么也不做,不處理。2,按照默認(rèn)的方式處理。3,捕獲并處理,捕獲到信號(hào)后,執(zhí)行我們自己想執(zhí)行的代碼。我們先來(lái)看下signal函數(shù):

linux進(jìn)程信號(hào)通信實(shí)例分析

編譯并運(yùn)行,因?yàn)槲覀兪褂玫膮?shù)為SIG_IGN,所以我們按下ctrl+c的時(shí)候并不能中斷程序運(yùn)行.

linux進(jìn)程信號(hào)通信實(shí)例分析

編譯并運(yùn)行,當(dāng)我們按下ctrl+c的時(shí)候,會(huì)中斷我們程序。

linux進(jìn)程信號(hào)通信實(shí)例分析

當(dāng)我們按下ctrl+c的時(shí)候,會(huì)進(jìn)去到fun函數(shù)。

linux進(jìn)程信號(hào)通信實(shí)例分析

 2,用戶空間不能發(fā)送信號(hào),信號(hào)的產(chǎn)生來(lái)自內(nèi)核,讓內(nèi)核產(chǎn)生信號(hào)的方式有:通過(guò)鍵盤輸入ctrl+c等。當(dāng)程序運(yùn)行出錯(cuò)時(shí),內(nèi)核會(huì)給進(jìn)程發(fā)送一個(gè)信號(hào),如浮點(diǎn)溢出等,還有就是一個(gè)程序可以通過(guò)調(diào)用函數(shù)來(lái)給另外一個(gè)進(jìn)程發(fā)信號(hào),如kill。

3,進(jìn)程收到信號(hào)后,可以忽略,或者按照默認(rèn)的方式處理,或者按照自己的處理函數(shù)來(lái)處理,signale是永久注冊(cè)的,每次都有效,如果不想的話這樣可以使用sigaction。

以上就是“l(fā)inux進(jìn)程信號(hào)通信實(shí)例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI