新聞中心
在Linux操作系統(tǒng)中,信號處理機(jī)制是一個十分重要的組成部分。本文將深入探討Linux內(nèi)核信號處理機(jī)制的相關(guān)內(nèi)容,包括信號的定義、信號的分類、信號的產(chǎn)生與傳遞、信號的處理、信號的控制等方面。

創(chuàng)新互聯(lián)建站是專業(yè)的冠縣網(wǎng)站建設(shè)公司,冠縣接單;提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行冠縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
一、信號的定義
信號是Linux內(nèi)核用于進(jìn)程間通訊的一種方式。它類似于一種軟件中斷,用于向進(jìn)程或線程發(fā)送通知,告訴它們發(fā)生了某種事件,需要采取一些措施來處理這個事件。信號本質(zhì)上是一種異步事件,它可以隨時發(fā)生,而不需要等待任何條件。
二、信號的分類
在Linux內(nèi)核中,信號按照不同的分類方式可以分為多種類型。最常見的兩種分類方式是按照信號的來源和按照信號的作用。
按照信號的來源,信號可以分為內(nèi)部信號和外部信號。內(nèi)部信號是由進(jìn)程自身產(chǎn)生的信號,例如 SIGALRM 信號表示進(jìn)程的定時器到期。外部信號是由操作系統(tǒng)或其他進(jìn)程發(fā)送給當(dāng)前進(jìn)程的信號,例如 SIGTERM 信號表示操作系統(tǒng)要求當(dāng)前進(jìn)程終止。
按照信號的作用,信號可以分為常規(guī)信號和實時信號。常規(guī)信號的處理方式是依次執(zhí)行信號處理程序,而實時信號可以排隊處理,保證更高的信號處理精度。
三、信號的產(chǎn)生與傳遞
當(dāng)一個進(jìn)程執(zhí)行期間產(chǎn)生一個信號時,操作系統(tǒng)會將信號發(fā)送給相應(yīng)的進(jìn)程或線程進(jìn)行處理。Linux內(nèi)核提供了信號處理機(jī)制來傳遞信號,并確保信號的正確性和可靠性。
當(dāng)一個信號被產(chǎn)生時,內(nèi)核會立即將信號的信息記錄在進(jìn)程的信號隊列中。當(dāng)進(jìn)程調(diào)用 sigwt 等待一個信號時,內(nèi)核會檢查該進(jìn)程的信號隊列,并在隊列中找到該信號。如果沒有找到該信號,則進(jìn)程將阻塞,直到該信號到達(dá)。
如果進(jìn)程已經(jīng)注冊了信號處理程序,則內(nèi)核會調(diào)用該處理程序來處理信號。處理程序可以采取多種措施來處理信號,例如打印一條消息、修改進(jìn)程狀態(tài)或調(diào)用其他函數(shù)等。
四、信號的處理
當(dāng)一個信號被傳遞到進(jìn)程時,內(nèi)核會執(zhí)行該進(jìn)程注冊的信號處理程序。信號處理程序可以是一個函數(shù)、一個名稱或者一個指針。在信號處理程序中,可以執(zhí)行多種操作,例如打印一條消息、修改進(jìn)程狀態(tài)或者調(diào)用其他函數(shù)等。
在信號處理程序中需要注意一些限制性條件。信號處理程序不能阻塞,否則會影響進(jìn)程的正常運(yùn)行。另外,信號處理程序不應(yīng)該訪問非本地變量,因為這些變量的值可能已被改變或失效。
五、信號的控制
Linux內(nèi)核提供了多種控制信號的機(jī)制,以便進(jìn)程可以根據(jù)需要來控制信號的產(chǎn)生和發(fā)送。常見的信號控制機(jī)制包括信號阻塞、信號屏蔽和信號處理等。
信號阻塞機(jī)制用于阻止特定信號的產(chǎn)生和傳遞。進(jìn)程可以通過調(diào)用 sigprocmask 函數(shù)來設(shè)置信號阻塞掩碼,以防止特定信號的處理程序被調(diào)用。
信號屏蔽機(jī)制用于限制特定時間段內(nèi)可以接收到的信號數(shù)量。進(jìn)程可以通過調(diào)用 sigsuspend 函數(shù)來阻塞當(dāng)前進(jìn)程,直到一個或多個特定的信號到達(dá)或特定的時間間隔過去。
信號處理機(jī)制用于設(shè)置信號處理程序。進(jìn)程可以通過調(diào)用 sigaction 函數(shù)來設(shè)置信號處理程序,以便在特定信號觸發(fā)時進(jìn)行處理。
Linux內(nèi)核信號處理機(jī)制是一個非常重要的組成部分,它提供了進(jìn)程間通訊的一種簡單而有效的方式。熟練掌握信號處理機(jī)制,可以為進(jìn)程之間的通訊和進(jìn)程控制等提供很大的幫助。相信讀者在閱讀本文后能夠?qū)inux內(nèi)核信號處理機(jī)制有一個更加深入的認(rèn)識。
相關(guān)問題拓展閱讀:
- 什么是linux kernel?有什么作用
- Linux進(jìn)程間通信
什么是linux kernel?有什么作用
linux系統(tǒng)的內(nèi)核,相當(dāng)于你的大腦
Linux內(nèi)核(英語:Linux kernel)是一種開源的類Unix操作系統(tǒng)宏內(nèi)核。
工作于平板電腦、智能手機(jī)及智能手表的Android操作系統(tǒng)同樣通過Linux內(nèi)核提供的服務(wù)完成自身功能。
一個計算機(jī)系統(tǒng)是一個硬件和軟件的共生體,它們互相依賴,不可分割。計算機(jī)的硬件,含有外圍設(shè)備、處理器、內(nèi)存、硬盤和其他的電子設(shè)備組成計算機(jī)的發(fā)動機(jī)。但是沒有軟件來操作和控制它,自身是不能工作的。
完成這個控制工作的軟件就稱為操作系統(tǒng),在Linux的術(shù)語中被稱為“內(nèi)核”,也可以稱為“核心”。Linux內(nèi)核的主要模塊(或組件)分以下幾個部分:存儲管理、CPU和進(jìn)程管理、文件系統(tǒng)、設(shè)備管理和驅(qū)動、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))、系統(tǒng)調(diào)用等。
整個Linux操作系統(tǒng)家族基于該內(nèi)核部署在傳統(tǒng)計算機(jī)平臺(如個人計算機(jī)和服務(wù)器,以Linux發(fā)行版的形式)和各種嵌入式平臺,如路由器、無線接入點、專用小交換機(jī)、機(jī)頂盒、FTA接收器、智能電視、數(shù)字視頻錄像機(jī)、網(wǎng)絡(luò)附加存儲(NAS)等。
工作于平板電腦、智能手機(jī)及智能手表的Android操作系統(tǒng)同樣通過Linux內(nèi)核提供的服務(wù)完成自身功能。盡管于桌面電腦的占用率較低,基于Linux的操作系統(tǒng)統(tǒng)治了幾乎從移動設(shè)備到主機(jī)的其他全部領(lǐng)域。截至2023年11月,世界前500臺最強(qiáng)的超級計算機(jī)全部使用Linux。
擴(kuò)展資料:
編程語言
Linux是用C語言中的GCC版(這種C語言有對標(biāo)準(zhǔn)C進(jìn)行擴(kuò)展)寫的,還有幾個用匯編語言(用的是GCC的”AT&T風(fēng)格”)寫的目標(biāo)架構(gòu)短段。因為要支持?jǐn)U展的C語言,GCC在很長的時間里是唯一一個能正確編譯Linux的編譯器。
有許多其他的語言用在一些方面上,主要集中在內(nèi)核構(gòu)建過程中(這里指從源代碼創(chuàng)建可引導(dǎo)鏡像)。包括Perl、Python和多種腳本語言。有一些驅(qū)動可能是用C++、Fortran或其他語言寫的,但是這樣是強(qiáng)烈不建議的。
編譯器兼容性
GCC是Linux內(nèi)核源代碼的缺省編譯器。在2023年,Intel主張通過修改內(nèi)核,以便Intel C++編譯器能正確編譯內(nèi)核。在2023年,有通過修改內(nèi)核2.6.22版而成功編譯的報告(并帶來平均8-9%性能增長)。
自從2023年,已經(jīng)開始進(jìn)行使用Clang建造Linux內(nèi)核的努力,Clang是一個可作為替代的C語言編譯器;截止2023年4月12日,官方內(nèi)核幾乎可以完全用Clang編譯。致力于這個目標(biāo)的計劃叫做“LLVMLinux”,得名于Clang所基于的LLVM編譯器下部構(gòu)造。
LLVMLinux不意圖復(fù)制Linux內(nèi)核或LLVM,因此它是由最終提交給上游計劃的補(bǔ)丁構(gòu)成的一個元計劃。使Linux內(nèi)核可以用Clang編譯更大的好處是比GCC有更快的編譯速度,內(nèi)核開發(fā)者可以得益于由此而來的更快的工作流程
linux kernel一般指Linux內(nèi)核,它是一個基于POSIX和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)內(nèi)核。
作用是將應(yīng)用層序的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動程序,對系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。
Linux內(nèi)核的主要模塊分以下幾個部分:存儲管理、CPU和進(jìn)程管理、文件系統(tǒng)、設(shè)備管理和驅(qū)動、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))、系統(tǒng)調(diào)用等。
擴(kuò)展資料
主要特性
1、完全免費
Linux是一款免費的操作系統(tǒng),用戶可以通過網(wǎng)絡(luò)或其他途徑免費獲得,并可以任意修改其源代碼。這是其他的操作系統(tǒng)所做不到的。正是由于這一點,來自全世界的無數(shù)程序員參與了Linux的修改、編寫工作,程序員可以根據(jù)自己的興趣和靈感對其進(jìn)行改變,這讓Linux吸收了無數(shù)程序員的精華,不斷壯大。
2、完全兼容POSIX1.0標(biāo)準(zhǔn)
這使得可以在Linux下通過相應(yīng)的模擬器運(yùn)行常見的DOS、Windows的程序。這為用戶從Windows轉(zhuǎn)到Linux奠定了基礎(chǔ)。許多用戶在考慮使用Linux時,就想到以前在Windows下常見的程序是否能正常運(yùn)行,這一點就消除了他們的疑慮。
3、多用戶、多任務(wù)
Linux支持多用戶,各個用戶對于自己的文件設(shè)備有自己特殊的權(quán)利,保證了各用戶之間互不影響。多任務(wù)則是現(xiàn)代電腦最主要的一個特點,Linux可以使多個程序同時并獨立地運(yùn)行。
4、支持多種平臺
Linux可以運(yùn)行在多種硬件平臺上,如具有x86、680×0、SPARC、Alpha等處理器的平臺。此外Linux還是一種嵌入式操作系統(tǒng),可以運(yùn)行在掌上電腦、機(jī)頂盒或游戲機(jī)上。
linux kernel 是linux內(nèi)核的意思 主要起到完成IO驅(qū)動設(shè)備管理,TCP/IP,以及任務(wù)調(diào)度
Linux進(jìn)程間通信
linux下進(jìn)程間通信的幾種主要手段簡介:
一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
實例1:用襪森于shell
管道可用于輸入輸出重定向,它將一個命令的輸出直接定向到另一個命令的輸入。比如,當(dāng)在某個shell程序(Bourne shell或C shell等)鍵入who│wc -l后,相應(yīng)shell程序?qū)?chuàng)建who以及wc兩個進(jìn)程和這兩個進(jìn)程間的管道。
實例二:用于具有親緣關(guān)系的進(jìn)程間通信
管道的主要局限性正體現(xiàn)在它的特點上:
有名管道的創(chuàng)建
小結(jié):
管道常用于兩個方面:(1)在shell中時常會用到管道(作為輸入輸入的重定向),在這種應(yīng)用方式下,管道的創(chuàng)建對于用戶來說是透明的;(2)用于具有親緣關(guān)系的進(jìn)程間通信,用戶自己創(chuàng)建管道,并完成讀寫操作。
FIFO可以說是管道的推廣,克服了管道無名字的限制,使得無親緣關(guān)系的進(jìn)程同樣可以采用先進(jìn)先出的通信機(jī)制進(jìn)行通信。
管道和FIFO的數(shù)據(jù)是字節(jié)流,應(yīng)用程序之間必須事先確定特定的傳輸”協(xié)議”,采用傳播具有特定意義的消息。
要靈活應(yīng)用管道及FIFO,理解它們的讀寫規(guī)則是關(guān)鍵。
信號生命周期
信號是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,可以看作是異步通知,通知接收信號的進(jìn)程有哪些事情發(fā)生了。信號機(jī)制經(jīng)過POSIX實時擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。
可以從兩個不同的分類角度對信號進(jìn)行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時間的關(guān)系上:實時信號與非實時信號。
(1) 可靠信號與不可靠信號
不可靠信號 :Linux下的不可靠信號問題主要指的是信號可能丟失。
可靠信號 :信號值位于SIGRTMIN和SIGRTMAX之間的信號都是可靠信號,可靠信號克服了信號可能丟失的問題。Linux在支持新版本的信號安裝函數(shù)sigation()以及信號發(fā)送函數(shù)sigqueue()的同時,仍然支持早期的signal()信號安裝函數(shù),支持信號發(fā)送函數(shù)kill()。
對于目前l(fā)inux的兩個信號安裝函數(shù):signal()及sigaction()來說,它們都不能把SIGRTMIN以前的信號變成可靠信號(都不支持排隊,仍有可能丟失,仍然是不可靠信號),而且對SIGRTMIN以后的信號都支持排隊。這兩個函數(shù)的更大區(qū)別在于,經(jīng)過sigaction安裝的信號都能傳遞信息給信號處理函數(shù)(對所有信號這一點都成立),而經(jīng)過signal安裝的信號卻不能向信號處理函數(shù)傳遞信息。對于信號發(fā)送函數(shù)來說也是一樣的。
(2) 實時信號與非實時信號
前32種信號已經(jīng)有了預(yù)定義值,每個信號有了確定的用途及含義,并且每種信號都有各自的缺省動作。如按鍵盤的CTRL ^C時,會產(chǎn)生SIGINT信號,對該信號的默認(rèn)反應(yīng)就是進(jìn)程終止。后32個信號表示實時信號,等同于前面闡述的可靠信號。這保證了發(fā)送的多個實時信號都被接收。實時信號是POSIX標(biāo)準(zhǔn)的一部分,可用于應(yīng)用進(jìn)程。非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。
發(fā)送信號的主要函數(shù)有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。
調(diào)用成功返回 0;否則,返回 -1。
sigqueue()是比較新的發(fā)送信號態(tài)好襲系統(tǒng)調(diào)用,主要是針對實時信號提出的(當(dāng)然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。
sigqueue的之一個參數(shù)是指定接收信號的進(jìn)程ID,第二個參數(shù)確定即將發(fā)送的信號,第三個參數(shù)是一個聯(lián)合數(shù)據(jù)結(jié)構(gòu)union sigval,指定了信號傳遞的參數(shù),即通常所說的4字節(jié)值。
sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進(jìn)程發(fā)送信號。sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進(jìn)程發(fā)送信號。
inux主要有兩個函數(shù)實現(xiàn)信號的安裝:
signal()
、
sigaction()
。其中signal()在可靠信號系統(tǒng)調(diào)用的基礎(chǔ)上實現(xiàn), 是庫函數(shù)。它只有兩個參數(shù),不支持信號傳遞信息,帆兄主要是用于前32種非實時信號的安裝;而sigaction()是較新的函數(shù)(由兩個系統(tǒng)調(diào)用實現(xiàn):sys_signal以及sys_rt_sigaction),有三個參數(shù),支持信號傳遞信息,主要用來與 sigqueue() 系統(tǒng)調(diào)用配合使用,當(dāng)然,sigaction()同樣支持非實時信號的安裝。sigaction()優(yōu)于signal()主要體現(xiàn)在支持信號帶有參數(shù)。
消息隊列就是一個消息的鏈表??梢园严⒖醋饕粋€記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權(quán)限的進(jìn)程可以向中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進(jìn)程則可以從消息隊列中讀走消息。消息隊列是隨內(nèi)核持續(xù)的
消息隊列的內(nèi)核持續(xù)性要求每個消息隊列都在系統(tǒng)范圍內(nèi)對應(yīng)唯一的鍵值,所以,要獲得一個消息隊列的描述字,只需提供該消息隊列的鍵值即可;
消息隊列與管道以及有名管道相比,具有更大的靈活性,首先,它提供有格式字節(jié)流,有利于減少開發(fā)人員的工作量;其次,消息具有類型,在實際應(yīng)用中,可作為優(yōu)先級使用。這兩點是管道以及有名管道所不能比的。同樣,消息隊列可以在幾個進(jìn)程間復(fù)用,而不管這幾個進(jìn)程是否具有親緣關(guān)系,這一點與有名管道很相似;但消息隊列是隨內(nèi)核持續(xù)的,與有名管道(隨進(jìn)程持續(xù))相比,生命力更強(qiáng),應(yīng)用空間更大。
信號燈與其他進(jìn)程間通信方式不大相同,它主要提供對進(jìn)程間共享資源訪問控制機(jī)制。相當(dāng)于內(nèi)存中的標(biāo)志,進(jìn)程可以根據(jù)它判定是否能夠訪問某些共享資源,同時,進(jìn)程也可以修改該標(biāo)志。除了用于訪問控制外,還可用于進(jìn)程同步。信號燈有以下兩種類型:
int semop(int semid, struct sembuf *sops, unsigned nsops); semid是信號燈集ID,sops指向數(shù)組的每一個sembuf結(jié)構(gòu)都刻畫一個在特定信號燈上的操作。
int semctl(int semid,int semnum,int cmd,union semun arg)
該系統(tǒng)調(diào)用實現(xiàn)對信號燈的各種控制操作,參數(shù)semid指定信號燈集,參數(shù)cmd指定具體的操作類型;參數(shù)semnum指定對哪個信號燈操作,只對幾個特殊的cmd操作有意義;arg用于設(shè)置或返回信號燈信息。
進(jìn)程間需要共享的數(shù)據(jù)被放在一個叫做IPC共享內(nèi)存區(qū)域的地方,所有需要訪問該共享區(qū)域的進(jìn)程都要把該共享區(qū)域映射到本進(jìn)程的地址空間中去。系統(tǒng)V共享內(nèi)存通過shmget獲得或創(chuàng)建一個IPC共享內(nèi)存區(qū)域,并返回相應(yīng)的標(biāo)識符。內(nèi)核在保證shmget獲得或創(chuàng)建一個共享內(nèi)存區(qū),初始化該共享內(nèi)存區(qū)相應(yīng)的shmid_kernel結(jié)構(gòu)注同時,還將在特殊文件系統(tǒng)shm中,創(chuàng)建并打開一個同名文件,并在內(nèi)存中建立起該文件的相應(yīng)dentry及inode結(jié)構(gòu),新打開的文件不屬于任何一個進(jìn)程(任何進(jìn)程都可以訪問該共享內(nèi)存區(qū))。所有這一切都是系統(tǒng)調(diào)用shmget完成的。
shmget()用來獲得共享內(nèi)存區(qū)域的ID,如果不存在指定的共享區(qū)域就創(chuàng)建相應(yīng)的區(qū)域。shmat()把共享內(nèi)存區(qū)域映射到調(diào)用進(jìn)程的地址空間中去,這樣,進(jìn)程就可以方便地對共享區(qū)域進(jìn)行訪問操作。shmdt()調(diào)用用來解除進(jìn)程對共享內(nèi)存區(qū)域的映射。shmctl實現(xiàn)對共享內(nèi)存區(qū)域的控制操作。這里我們不對這些系統(tǒng)調(diào)用作具體的介紹,讀者可參考相應(yīng)的手冊頁面,后面的范例中將給出它們的調(diào)用方法。
注:shmget的內(nèi)部實現(xiàn)包含了許多重要的系統(tǒng)V共享內(nèi)存機(jī)制;shmat在把共享內(nèi)存區(qū)域映射到進(jìn)程空間時,并不真正改變進(jìn)程的頁表。當(dāng)進(jìn)程之一次訪問內(nèi)存映射區(qū)域訪問時,會因為沒有物理頁表的分配而導(dǎo)致一個缺頁異常,然后內(nèi)核再根據(jù)相應(yīng)的存儲管理機(jī)制為共享內(nèi)存映射區(qū)域分配相應(yīng)的頁表。
關(guān)于linux kernel signal的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享名稱:深入理解Linux內(nèi)核信號處理機(jī)制(linuxkernelsignal)
當(dāng)前路徑:http://m.fisionsoft.com.cn/article/cdodihd.html


咨詢
建站咨詢
