久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

專欄中心

EEPW首頁 > 專欄 > Linux信號(hào)機(jī)制與信號(hào)處理分享

Linux信號(hào)機(jī)制與信號(hào)處理分享

發(fā)布人:only1 時(shí)間:2020-08-20 來源:工程師 發(fā)布文章

今天扣丁學(xué)堂小編給大家整理一下關(guān)于Linux信號(hào)機(jī)制與信號(hào)處理的詳細(xì)介紹,首先信號(hào)(signal)是Linux進(jìn)程間通信的一種機(jī)制,全稱為軟中斷信號(hào),也被稱為軟中斷。信號(hào)本質(zhì)上是在軟件層次上對(duì)硬件中斷機(jī)制的一種模擬。 

 

與其他進(jìn)程間通信方式(例如管道、共享內(nèi)存等)相比,信號(hào)所能傳遞的信息比較少,只是一個(gè)整數(shù)。信號(hào)只是用來通知某進(jìn)程發(fā)生了什么事件,并不給該進(jìn)程傳遞任何數(shù)據(jù)。但正是由于傳遞的信息量少,信號(hào)也便于管理和使用,可以用于系統(tǒng)管理相關(guān)的任務(wù),例如通知進(jìn)程終結(jié)、中止或者恢復(fù)等。  

每種信號(hào)用一個(gè)整型常量宏表示,以SIG開頭,比如SIGCHLD、SIGINT等,它們?cè)谙到y(tǒng)頭文件中定義。  

信號(hào)由內(nèi)核(kernel)管理,產(chǎn)生方式多種多樣:  

可以由內(nèi)核自身產(chǎn)生,比如出現(xiàn)硬件錯(cuò)誤、內(nèi)存讀取錯(cuò)誤,分母為0的除法等,內(nèi)核需要通知相應(yīng)進(jìn)程。  

也可以由其他進(jìn)程產(chǎn)生并發(fā)送給內(nèi)核,再由內(nèi)核傳遞給目標(biāo)進(jìn)程。  

信號(hào)傳遞的過程  

內(nèi)核中針對(duì)每一個(gè)進(jìn)程都有一個(gè)表來保存信號(hào)。  

當(dāng)內(nèi)核需要將信號(hào)傳遞給某個(gè)進(jìn)程時(shí),就在該進(jìn)程對(duì)應(yīng)的表中寫入信號(hào),這樣就生成了信號(hào)。  

當(dāng)該進(jìn)程由用戶態(tài)陷入內(nèi)核態(tài),再次切換到用戶態(tài)之前,會(huì)查看表中的信號(hào)。如果有信號(hào),進(jìn)程就會(huì)首先執(zhí)行信號(hào)對(duì)應(yīng)的操作,此時(shí)叫做執(zhí)行信號(hào)。  

從生成信號(hào)到將信號(hào)傳遞給對(duì)應(yīng)進(jìn)程這段時(shí)間,信號(hào)處于等待狀態(tài)。  

我們可以編寫代碼,讓進(jìn)程阻塞(block)某些信號(hào),也就是讓這些信號(hào)始終處于等待的狀態(tài),直到進(jìn)程取消阻塞(unblock)或者忽略信號(hào)。  

一些常見信號(hào)  

SIGHUP1終端掛起或控制進(jìn)程終止。當(dāng)用戶退出Shell時(shí),由該進(jìn)程啟動(dòng)的所有進(jìn)程都會(huì)收到這個(gè)信號(hào),默認(rèn)動(dòng)作為終止進(jìn)程。  

SIGINT2鍵盤中斷。當(dāng)用戶按下組合鍵時(shí),用戶終端向正在運(yùn)行中的由該終端啟動(dòng)的程序發(fā)出此信號(hào)。默認(rèn)動(dòng)作為終止進(jìn)程。  

SIGQUIT3鍵盤退出鍵被按下。當(dāng)用戶按下或組合鍵時(shí),用戶終端向正在運(yùn)行中的由該終端啟動(dòng)的程序發(fā)出此信號(hào)。默認(rèn)動(dòng)作為退出程序。  

SIGILL4非法指令  

SIGABRT6由abort(3)發(fā)出的退出指令  

SIGFPE8發(fā)生致命的運(yùn)算錯(cuò)誤時(shí)發(fā)出。不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤,還包括溢出及除數(shù)為0等所有的算法錯(cuò)誤。默認(rèn)動(dòng)作為終止進(jìn)程并產(chǎn)生core文件。  

SIGKILL9無條件終止進(jìn)程。進(jìn)程接收到該信號(hào)會(huì)立即終止,不進(jìn)行清理和暫存工作。該信號(hào)不能被忽略、處理和阻塞,它向系統(tǒng)管理員提供了可以殺死任何進(jìn)程的方法。  

SIGSEGV11無效的內(nèi)存引用  

SIGALRM14定時(shí)器超時(shí),默認(rèn)動(dòng)作為終止進(jìn)程。  

SIGTERM15程序結(jié)束信號(hào),可以由kill命令產(chǎn)生。與SIGKILL不同的是,SIGTERM信號(hào)可以被阻塞和終止,以便程序在退出前可以保存工作或清理臨時(shí)文件等。  

使用實(shí)例  

通過kill-l命令可以查看系統(tǒng)支持的所有信號(hào):  

$kill-l  

1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL  

5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE  

9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR2  

13)SIGPIPE14)SIGALRM15)SIGTERM17)SIGCHLD  

18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN  

22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ  

26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO  

30)SIGPWR31)SIGSYS34)SIGRTMIN35)SIGRTMIN+1  

36)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+439)SIGRTMIN+5  

40)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+843)SIGRTMIN+9  

44)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+1247)SIGRTMIN+13  

48)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAX-1451)SIGRTMAX-13  

52)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-9  

56)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-659)SIGRTMAX-5  

60)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-263)SIGRTMAX-1  

64)SIGRTMAX  

注意:上面是在CentOS下的命令執(zhí)行結(jié)果,不同的Linux發(fā)行版支持的信號(hào)可能不同。  

每種信號(hào)都會(huì)有一個(gè)默認(rèn)動(dòng)作。默認(rèn)動(dòng)作就是腳本或程序接收到該信號(hào)所做出的默認(rèn)操作。常見的默認(rèn)動(dòng)作有終止進(jìn)程、退出程序、忽略信號(hào)、重啟暫停的進(jìn)程等,上表中也對(duì)部分默認(rèn)動(dòng)作進(jìn)行了說明。  

發(fā)送信號(hào)  

有多種方式可以向程序或腳本發(fā)送信號(hào),例如按下組合鍵會(huì)發(fā)送SIGINT信號(hào),終止當(dāng)前進(jìn)程。  

還可以通過kill命令發(fā)送信號(hào),語法為:  

$kill-signalpid  

signal為要發(fā)送的信號(hào),可以是信號(hào)名稱或數(shù)字;pid為接收信號(hào)的進(jìn)程ID。例如:  

$kill-135365  

將SIGHUP信號(hào)發(fā)送給進(jìn)程ID為35365的進(jìn)程,程序會(huì)終止執(zhí)行。  

強(qiáng)制殺死ID為35365的進(jìn)程:  

$kill-935365  

捕獲信號(hào)  

通常情況下,直接終止進(jìn)程并不是我們所希望的。例如,按下,進(jìn)程被立即終止,不會(huì)清理創(chuàng)建的臨時(shí)文件,帶來系統(tǒng)垃圾,也不會(huì)保存正在進(jìn)行的工作,導(dǎo)致需要重做。  

可以通過編程來捕獲這些信號(hào),當(dāng)終止信號(hào)出現(xiàn)時(shí),可以先進(jìn)行清場和保存處理,再退出程序。  

通過trap命令就可以捕獲信號(hào),語法為:  

$trapcommandssignals  

commands為Linux系統(tǒng)命令或用戶自定義命令;signals為要捕獲的信號(hào),可以為信號(hào)名稱或數(shù)字。  

捕獲到信號(hào)后,可以有三種處理:  

執(zhí)行一段腳本來做一些處理工作,例如清理臨時(shí)文件;  

接受(恢復(fù))信號(hào)的默認(rèn)操作;  

忽略當(dāng)前信號(hào)。  

a.清理臨時(shí)文件  

腳本捕獲到終止信號(hào)后一個(gè)常見的動(dòng)作就是清理臨時(shí)文件。例如:  

$trap"rm-f$WORKDIR/tmp$$$WORKDIR/tmpTest$$;exit"2  

當(dāng)用戶按下后,腳本先清理臨時(shí)文件tmp$$和tmpTest$$再退出。  

注意:exit命令是必須的,否則腳本捕獲到信號(hào)后會(huì)繼續(xù)執(zhí)行而不是退出。  

修改上面的腳本,使接收到SIGHUP時(shí)進(jìn)行同樣的操作:  

$trap"rm$WORKDIR/tmp$$$WORKDIR/tmpTest$$;exit"12  

幾點(diǎn)注意:  

如果執(zhí)行多個(gè)命令,需要將命令用引號(hào)包圍;  

只有腳本執(zhí)行到trap命令時(shí)才會(huì)捕獲信號(hào);  

再次接收到信號(hào)時(shí)還會(huì)執(zhí)行同樣的操作。  

上面的腳本,執(zhí)行到trap命令時(shí)就會(huì)替換WORKDIR和$$的值。如果希望接收到SIGHUP或SIGINT信號(hào)時(shí)再替換其值,那么可以將命令放在單引號(hào)內(nèi),例如:  

$trap'rm$WORKDIR/tmp$$$WORKDIR/tmpTest$$;exit'12  

b.忽略信號(hào)  

如果trap命令的commands為空,將會(huì)忽略接收到的信號(hào),即不做任何處理,也不執(zhí)行默認(rèn)動(dòng)作。例如:  

$trap''2  

也可以同時(shí)忽略多個(gè)信號(hào):  

$trap''12315  

注意:必須被引號(hào)包圍,不能寫成下面的形式:  

$trap2  

c.恢復(fù)默認(rèn)動(dòng)作  

如果希望改變信號(hào)的默認(rèn)動(dòng)作后再次恢復(fù)默認(rèn)動(dòng)作,那么省略trap命令的commands即可,例如:  

$trap12  

將恢復(fù)SIGHUP和SIGINT信號(hào)的默認(rèn)動(dòng)作。  

以上就是關(guān)于Linux信號(hào)機(jī)制與信號(hào)處理的詳細(xì)介紹,最后扣丁學(xué)堂的Linux培訓(xùn)課程從基礎(chǔ)入門開始教,不論學(xué)員是否擁有基礎(chǔ)在扣丁學(xué)堂都能順利的學(xué)習(xí),扣丁學(xué)堂不僅有專業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀看學(xué)習(xí),想要學(xué)好Linux開發(fā)的小伙伴快快行動(dòng)吧。扣丁學(xué)堂Linux技術(shù)交流群:659974587。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

關(guān)鍵詞:

相關(guān)推薦

現(xiàn)代化交流電網(wǎng)以實(shí)現(xiàn)未來穩(wěn)定

Intersil公司2010年路演武漢站講座1--通信電源解決方案

視頻 2011-10-18

單片機(jī)器件應(yīng)用手冊(cè)

PIC系列單片機(jī)原理和程序設(shè)計(jì)

使用源開關(guān)SiC JFET的反激變換器設(shè)計(jì)AND90330/D

美國計(jì)劃自1970年代以來最大規(guī)模的核能項(xiàng)目

單片機(jī)實(shí)用開發(fā)指南

環(huán)境能源管理器處理兩種能量收集源

電網(wǎng)級(jí)的泡泡電池很快就會(huì)普及

我們現(xiàn)在知道火星上的時(shí)鐘會(huì)快得多

MCS-51單片機(jī)開發(fā)系統(tǒng)與監(jiān)控分析

Intersil公司2010年路演武漢站講座4--用于儀器及工業(yè)應(yīng)用的高性能模擬信號(hào)鏈產(chǎn)品

MCS-51單片機(jī)應(yīng)用設(shè)計(jì)

Intersil公司2010年路演武漢站講座7--車載信息娛樂系統(tǒng)

視頻 2011-10-18

2026內(nèi)存危機(jī):手機(jī)電腦漲價(jià),竟因AI搶走了所有芯片?

這個(gè)AI能在石頭剪刀布上打敗你:儲(chǔ)層計(jì)算芯片提供快速且低功耗的預(yù)測

Intersil公司2010年路演武漢站講座5--離線式LED照明驅(qū)動(dòng)方案

Intersil公司2010年路演武漢站講座6--無線基礎(chǔ)設(shè)施應(yīng)用解決方案

視頻 2011-10-18

虛擬同步機(jī)可以幫助穩(wěn)定電網(wǎng)

電源與新能源 2025-12-22

我們會(huì)在看到通用人工智能時(shí)認(rèn)出它嗎?

更多 培訓(xùn)課堂
更多 焦點(diǎn)
更多 視頻

技術(shù)專區(qū)