欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Linux視頻教程淺談信號(hào)機(jī)制與信號(hào)處理

2018-01-08 10:49:12 1370瀏覽

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


扣丁學(xué)堂Linux視頻教程淺談信號(hào)機(jī)制與信號(hào)處理


與其他進(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)的表中寫入信號(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)。

一些常見(jiàn)信號(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無(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)名稱或數(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)命令或用戶自定義命令;signals為要捕獲的信號(hào),可以為信號(hào)名稱或數(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)用戶按下后,腳本先清理臨時(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ǔ)入門開(kāi)始教,不論學(xué)員是否擁有基礎(chǔ)在扣丁學(xué)堂都能順利的學(xué)習(xí),扣丁學(xué)堂不僅有專業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀看學(xué)習(xí),想要學(xué)好Linux開(kāi)發(fā)的小伙伴快快行動(dòng)吧??鄱W(xué)堂Linux技術(shù)交流群:422345477。





扣丁學(xué)堂微信公眾號(hào)



關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料



查看更多關(guān)于“Linux培訓(xùn)資訊的相關(guān)文章>>

標(biāo)簽: Linux命令 Linux視頻教程 Linux培訓(xùn) Linux在線學(xué)習(xí) Linux在線視頻

熱門專區(qū)

暫無(wú)熱門資訊

課程推薦

微信
微博
15311698296

全國(guó)免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠(chéng)科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部