熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > Linux信號(hào)機(jī)制與信號(hào)處理分享

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

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

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

 

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

每種信號(hào)用一個(gè)整型常量宏表示,以SIG開(kāi)頭,比如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)傳遞的過(guò)程  

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

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

當(dāng)該進(jìn)程由用戶(hù)態(tài)陷入內(nèi)核態(tài),再次切換到用戶(hù)態(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)。  

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

一些常見(jiàn)信號(hào)  

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

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

SIGQUIT3鍵盤(pán)退出鍵被按下。當(dāng)用戶(hù)按下或組合鍵時(shí),用戶(hù)終端向正在運(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無(wú)條件終止進(jìn)程。進(jìn)程接收到該信號(hào)會(huì)立即終止,不進(jìn)行清理和暫存工作。該信號(hào)不能被忽略、處理和阻塞,它向系統(tǒng)管理員提供了可以殺死任何進(jìn)程的方法。  

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

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

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

使用實(shí)例  

通過(guò)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)操作。常見(jiàn)的默認(rèn)動(dòng)作有終止進(jìn)程、退出程序、忽略信號(hào)、重啟暫停的進(jìn)程等,上表中也對(duì)部分默認(rèn)動(dòng)作進(jìn)行了說(shuō)明。  

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

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

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

$kill-signalpid  

signal為要發(fā)送的信號(hào),可以是信號(hào)名稱(chēng)或數(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í)文件,帶來(lái)系統(tǒng)垃圾,也不會(huì)保存正在進(jìn)行的工作,導(dǎo)致需要重做。  

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

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

$trapcommandssignals  

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

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

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

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

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

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

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

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

當(dāng)用戶(hù)按下后,腳本先清理臨時(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)包圍,不能寫(xiě)成下面的形式:  

$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ǔ)入門(mén)開(kāi)始教,不論學(xué)員是否擁有基礎(chǔ)在扣丁學(xué)堂都能順利的學(xué)習(xí),扣丁學(xué)堂不僅有專(zhuān)業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀看學(xué)習(xí),想要學(xué)好Linux開(kāi)發(fā)的小伙伴快快行動(dòng)吧??鄱W(xué)堂Linux技術(shù)交流群:659974587。


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



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉