




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章
捕獲13.1信號(hào)在Linux中,理解信號(hào)的概念是非常重要的。這是因?yàn)?,信?hào)被用于通過(guò)Linux命令行所做的一些常見(jiàn)活動(dòng)中。例如,每當(dāng)你按CTRL+C鍵來(lái)從命令行終結(jié)一個(gè)命令的執(zhí)行,你就使用了信號(hào)。每當(dāng)你使用如下命令來(lái)結(jié)束一個(gè)進(jìn)程時(shí),你就使用了信號(hào):$kill-9[PID]所以,至少知道信號(hào)的基本原理是非常有用的。這也就是本節(jié)我們要討論的內(nèi)容。13.1.1Linux中的信號(hào)在Linux系統(tǒng)(以及其它類(lèi)Unix操作系統(tǒng))中,信號(hào)被用于進(jìn)程間的通訊。信號(hào)是一個(gè)發(fā)送到某個(gè)進(jìn)程或同一進(jìn)程中的特定線程的異步通知,用于通知發(fā)生的一個(gè)事件。從1970年貝爾實(shí)驗(yàn)室的Unix面世便有了信號(hào)的概念,而現(xiàn)在它已經(jīng)被定義在了POSIX標(biāo)準(zhǔn)中。對(duì)于在Linux環(huán)境進(jìn)行編程的用戶(hù)或系統(tǒng)管理員來(lái)說(shuō),較好地理解信號(hào)的概念和機(jī)制是很重要的,在某些情況下可以幫助我們更高效地編寫(xiě)程序。對(duì)于一個(gè)程序來(lái)說(shuō),如果每條指令運(yùn)行正常的話,它會(huì)連續(xù)地執(zhí)行。但如果在程序執(zhí)行時(shí),出現(xiàn)了一個(gè)錯(cuò)誤或任何異常,內(nèi)核就可以使用信號(hào)來(lái)通知相應(yīng)的進(jìn)程。信號(hào)同樣被用于通訊、同步進(jìn)程和簡(jiǎn)化進(jìn)程間通訊,在Linux中,信號(hào)在處理異常和中斷方面,扮演了極其重要的角色。信號(hào)已經(jīng)在沒(méi)有任何較大修改的情況下被使用了將近30年。13.1.1Linux中的信號(hào)在Linux系統(tǒng)(以及其它類(lèi)Unix操作系統(tǒng))中,信號(hào)被用于進(jìn)程間的通訊。信號(hào)是一個(gè)發(fā)送到某個(gè)進(jìn)程或同一進(jìn)程中的特定線程的異步通知,用于通知發(fā)生的一個(gè)事件。從1970年貝爾實(shí)驗(yàn)室的Unix面世便有了信號(hào)的概念,而現(xiàn)在它已經(jīng)被定義在了POSIX標(biāo)準(zhǔn)中。對(duì)于在Linux環(huán)境進(jìn)行編程的用戶(hù)或系統(tǒng)管理員來(lái)說(shuō),較好地理解信號(hào)的概念和機(jī)制是很重要的,在某些情況下可以幫助我們更高效地編寫(xiě)程序。對(duì)于一個(gè)程序來(lái)說(shuō),如果每條指令運(yùn)行正常的話,它會(huì)連續(xù)地執(zhí)行。但如果在程序執(zhí)行時(shí),出現(xiàn)了一個(gè)錯(cuò)誤或任何異常,內(nèi)核就可以使用信號(hào)來(lái)通知相應(yīng)的進(jìn)程。信號(hào)同樣被用于通訊、同步進(jìn)程和簡(jiǎn)化進(jìn)程間通訊,在Linux中,信號(hào)在處理異常和中斷方面,扮演了極其重要的角色。信號(hào)已經(jīng)在沒(méi)有任何較大修改的情況下被使用了將近30年。13.1.1Linux中的信號(hào)當(dāng)一個(gè)事件發(fā)生時(shí),會(huì)產(chǎn)生一個(gè)信號(hào),然后內(nèi)核會(huì)將事件傳遞到接收的進(jìn)程。有時(shí),進(jìn)程可以發(fā)送一個(gè)信號(hào)到其它進(jìn)程。除了進(jìn)程到進(jìn)程的信號(hào)外,還有很多種情況,內(nèi)核會(huì)產(chǎn)生一個(gè)信號(hào),比如文件大小達(dá)到限額、一個(gè)I/O設(shè)備就緒或用戶(hù)發(fā)送了一個(gè)類(lèi)似于CTRL+C或CTRL+Z的終端中斷等。運(yùn)行在用戶(hù)模式下的進(jìn)程會(huì)接收信號(hào)。如果接收的進(jìn)程正運(yùn)行在內(nèi)核模式,那么信號(hào)的執(zhí)行只有在該進(jìn)程返回到用戶(hù)模式時(shí)才會(huì)開(kāi)始。13.1.1Linux中的信號(hào)發(fā)送到非運(yùn)行進(jìn)程的信號(hào)一定是由內(nèi)核保存,直到進(jìn)程重新執(zhí)行為止。休眠的進(jìn)程可以是可中斷的,也可以是不可中斷的。如果一個(gè)在可中斷休眠狀態(tài)的進(jìn)程(例如,等待終端輸入的進(jìn)程)收到了一個(gè)信號(hào),那么內(nèi)核會(huì)喚醒這個(gè)進(jìn)程來(lái)處理信號(hào)。如果一個(gè)在不可中斷休眠狀態(tài)的進(jìn)程收到了一個(gè)信號(hào),那么內(nèi)核會(huì)拖延此信號(hào),直到該事件完成為止。13.1.1Linux中的信號(hào)當(dāng)進(jìn)程收到一個(gè)信號(hào)時(shí),可能會(huì)發(fā)生以下三種情況:進(jìn)程可能會(huì)忽略此信號(hào)。有些信號(hào)不能被忽略,而有些沒(méi)有默認(rèn)行為的信號(hào),默認(rèn)會(huì)被忽略。進(jìn)程可能會(huì)捕獲此信號(hào),并執(zhí)行一個(gè)被稱(chēng)為信號(hào)處理器的特殊函數(shù)。進(jìn)程可能會(huì)執(zhí)行信號(hào)的默認(rèn)行為。例如,信號(hào)15(SIGTERM)的默認(rèn)行為是結(jié)束進(jìn)程。當(dāng)一個(gè)進(jìn)程執(zhí)行信號(hào)處理時(shí),如果還有其它信號(hào)到達(dá),那么新的信號(hào)會(huì)被阻斷直到處理器返回為止。13.1.2信號(hào)的名稱(chēng)和值每個(gè)信號(hào)都有“SIG”開(kāi)頭的名稱(chēng),并定義為唯一的正整數(shù)。在Shell命令行提示符下,輸入“kill-l”命令,將顯示所有信號(hào)的信號(hào)值和相應(yīng)的信號(hào)名。13.1.3Bash中的信號(hào)當(dāng)沒(méi)有任何捕獲時(shí),一個(gè)交互式BashShell會(huì)忽略SIGTERM和SIGQUIT信號(hào)。由Bash運(yùn)行的非內(nèi)部命令會(huì)使用Shell從其父進(jìn)程繼承的信號(hào)處理程序。如果沒(méi)有啟用作業(yè)控制,異步執(zhí)行的命令會(huì)忽略除了有這些信號(hào)處理程序之外的SIGINT和SIGQUIT信號(hào)。由于命令替換而運(yùn)行的命令會(huì)忽略鍵盤(pán)產(chǎn)生的作業(yè)控制信號(hào)SIGTTIN、SIGTTOU和SIGTSTP。13.1.3Bash中的信號(hào)默認(rèn)情況下,Shell接收到SIGHUP信號(hào)后會(huì)退出。在退出之前,一個(gè)交互式的Shell會(huì)向所有的作業(yè),不管是正在運(yùn)行的還是已停止的,重新發(fā)送SIGHUP信號(hào)。對(duì)已停止的作業(yè),Shell還會(huì)發(fā)送SIGCONT信號(hào)以確保它能夠接收到SIGHUP信號(hào)。若要阻止Shell向某個(gè)特定的作業(yè)發(fā)送SIGHUP信號(hào),可以使用內(nèi)部命令disown將它從作業(yè)表中移除,或是用“disown-h”命令仍阻止Shell向特定的作業(yè)發(fā)送SIGHUP信號(hào),但并不會(huì)將特定的作業(yè)從作業(yè)表中移除。13.2進(jìn)程13.2.1什么是進(jìn)程進(jìn)程是運(yùn)行在Linux中的程序的一個(gè)實(shí)例。這是一個(gè)你之前就可能已經(jīng)聽(tīng)說(shuō)過(guò)的基本定義。當(dāng)你在Linux系統(tǒng)中執(zhí)行一個(gè)程序時(shí),系統(tǒng)會(huì)為這個(gè)程序創(chuàng)建特定的環(huán)境。這個(gè)環(huán)境包含系統(tǒng)運(yùn)行這個(gè)程序所需的任何東西。每當(dāng)你在Linux中執(zhí)行一個(gè)命令,它都會(huì)創(chuàng)建,或啟動(dòng)一個(gè)新的進(jìn)程。比如,當(dāng)你嘗試運(yùn)行命令“l(fā)s-l”來(lái)列出目錄的內(nèi)容時(shí),你就啟動(dòng)了一個(gè)進(jìn)程。如果有兩個(gè)終端窗口顯示在屏幕上,那么你可能運(yùn)行了同樣的終端程序兩次,這時(shí)會(huì)有兩個(gè)終端進(jìn)程。每個(gè)終端窗口可能都運(yùn)行了一個(gè)Shell,每個(gè)運(yùn)行的Shell都分別是一個(gè)進(jìn)程。當(dāng)你從Shell調(diào)用一個(gè)命令時(shí),對(duì)應(yīng)的程序就會(huì)在一個(gè)新進(jìn)程中執(zhí)行,當(dāng)這個(gè)程序的進(jìn)程執(zhí)行完成后,Shell的進(jìn)程將恢復(fù)運(yùn)行。13.2.1什么是進(jìn)程操作系統(tǒng)通過(guò)被稱(chēng)為PID或進(jìn)程ID的數(shù)字編碼來(lái)追蹤進(jìn)程。系統(tǒng)中的每一個(gè)進(jìn)程都有一個(gè)唯一的PID?,F(xiàn)在我們通過(guò)一個(gè)實(shí)例來(lái)了解Linux中的進(jìn)程。我們?cè)赟hell命令行下執(zhí)行如下命令:$sleep10&[1]3324因?yàn)槌绦驎?huì)等待10秒,所以我們快速地在當(dāng)前Shell上查找任何進(jìn)程名為sleep的進(jìn)程:$ps-ef|grepsleepyantaol33245712cons117:11:46/usr/bin/sleep我們看到進(jìn)程名為/usr/bin/sleep的進(jìn)程正運(yùn)行在系統(tǒng)中(其PID與我們?cè)谏弦幻钪械玫降腜ID相同)。13.2.1什么是進(jìn)程現(xiàn)在,我們嘗試并行地從3個(gè)不同的終端窗口運(yùn)行上述的sleep命令,上述命令的輸出將類(lèi)似如下所示:$ps-ef|grepsleepyantaol8965712cons117:16:51/usr/bin/sleepyantaol59245712cons117:16:52/usr/bin/sleepyantaol24245712cons117:16:50/usr/bin/sleep我們看到sleep程序的每一個(gè)實(shí)例都創(chuàng)建了一個(gè)單獨(dú)的進(jìn)程。每個(gè)Linux進(jìn)程還有另一個(gè)ID號(hào)碼,即父進(jìn)程的ID(ppid)。系統(tǒng)中的每一個(gè)用戶(hù)進(jìn)程都有一個(gè)父進(jìn)程。命令“ps-f”就會(huì)列出進(jìn)程的PID和PPID。此命令的輸出類(lèi)似如下所示:$ps-fUIDPIDPPIDTTYSTIMECOMMANDyantaol4124228 cons0 21:37:09/usr/bin/psyantaol2281 cons0 21:32:23/usr/bin/bash13.2.1什么是進(jìn)程你在Shell命令行提示符下運(yùn)行的命令都把當(dāng)前Shell的進(jìn)程作為父進(jìn)程。例如,你在Shell命令行提示符下輸入ls命令,Shell將執(zhí)行l(wèi)s命令,此時(shí)Linux內(nèi)核會(huì)復(fù)制Shell的內(nèi)存頁(yè),然后執(zhí)行l(wèi)s命令。在Unix中,每一個(gè)進(jìn)程是使用fork和exec方法創(chuàng)建的。然而,這種方法會(huì)導(dǎo)致系統(tǒng)資源的損耗。在Linux中,fork方法是使用寫(xiě)時(shí)拷貝內(nèi)存頁(yè)實(shí)現(xiàn)的,所以它導(dǎo)致的僅是時(shí)間和復(fù)制父進(jìn)程的內(nèi)存頁(yè)表所需的內(nèi)存的損失,并且會(huì)為子進(jìn)程創(chuàng)建一個(gè)唯一的任務(wù)結(jié)構(gòu)。寫(xiě)時(shí)拷貝模式在創(chuàng)建新進(jìn)程時(shí)避免創(chuàng)建不必要的結(jié)構(gòu)拷貝。例如,用戶(hù)在Shell命令行提示符下輸出ls命令,Linux內(nèi)核將會(huì)創(chuàng)建一個(gè)Shell的子進(jìn)程,即Shell的進(jìn)程是父進(jìn)程,而ls命令的進(jìn)程是子進(jìn)程,ls命令的進(jìn)程會(huì)指向與此Shell相同的內(nèi)存頁(yè),然后子進(jìn)程使用寫(xiě)時(shí)拷貝技術(shù)執(zhí)行l(wèi)s命令。13.2.2前臺(tái)進(jìn)程和后臺(tái)進(jìn)程當(dāng)你啟動(dòng)一個(gè)進(jìn)程時(shí)(運(yùn)行一個(gè)命令),可以如下兩種方式運(yùn)行該進(jìn)程:前臺(tái)進(jìn)程后臺(tái)進(jìn)程默認(rèn)情況下,你啟動(dòng)的每一個(gè)進(jìn)程都是運(yùn)行在前臺(tái)。它從鍵盤(pán)獲取輸入并發(fā)送它的輸出到屏幕。當(dāng)一個(gè)進(jìn)程運(yùn)行在前臺(tái)時(shí),我們不能在同一命令行提示符下運(yùn)行任何其它命令(啟動(dòng)任何其它進(jìn)程),因?yàn)樵诔绦蚪Y(jié)束它的進(jìn)程之前命令行提示符不可用。啟動(dòng)一個(gè)后臺(tái)進(jìn)程最簡(jiǎn)單的方法是添加一個(gè)控制操作符‘&’到命令的結(jié)尾(關(guān)于進(jìn)程在前臺(tái)和后臺(tái)之間切換的內(nèi)容,請(qǐng)參見(jiàn)4.3.3節(jié))。13.2.2前臺(tái)進(jìn)程和后臺(tái)進(jìn)程例如,如下命令將啟動(dòng)一個(gè)后臺(tái)進(jìn)程:$sleep10&[1]5720$現(xiàn)在sleep命令被放在后臺(tái)運(yùn)行。當(dāng)Bash在后臺(tái)啟動(dòng)一個(gè)作業(yè)時(shí),它會(huì)打印一行內(nèi)容顯示作業(yè)編號(hào)([1])和進(jìn)程號(hào)(PID-5720)。當(dāng)作業(yè)完成時(shí),作業(yè)會(huì)發(fā)送類(lèi)似如下的信息到終端程序,來(lái)顯示此作業(yè)已完成,其內(nèi)容類(lèi)似如下所示:[1]+Donesleep10將進(jìn)程放在后臺(tái)運(yùn)行的好處是:你可以繼續(xù)運(yùn)行其它命令,而不需要等待此進(jìn)程運(yùn)行完成再運(yùn)行其它命令。13.2.3進(jìn)程的狀態(tài)每個(gè)Linux進(jìn)程都有它自己的生命周期,比如,創(chuàng)建、執(zhí)行、結(jié)束和清除。每個(gè)進(jìn)程也都有各自的狀態(tài),顯示進(jìn)程中當(dāng)前正發(fā)生什么。進(jìn)程可以有如下幾種狀態(tài):D(不可中斷休眠狀態(tài))-進(jìn)程正在休眠并且不能恢復(fù),直到一個(gè)事件發(fā)生為止。R(運(yùn)行狀態(tài))-進(jìn)程正在運(yùn)行。S(休眠狀態(tài))-進(jìn)程沒(méi)有在運(yùn)行,而在等待一個(gè)事件或是信號(hào)。T(停止?fàn)顟B(tài))-進(jìn)程被信號(hào)停止,比如,信號(hào)SIGINT或SIGSTOP。Z(僵死狀態(tài))-標(biāo)記為<defunct>進(jìn)程是僵死的進(jìn)程,它們之所以殘留是因?yàn)樗鼈兊母高M(jìn)程適當(dāng)?shù)劁N(xiāo)毀它們。如果父進(jìn)程退出,這些進(jìn)程將被init進(jìn)程銷(xiāo)毀。13.2.3進(jìn)程的狀態(tài)若要查看指定進(jìn)程的狀態(tài),可以使用如下命令:$ps-CprocessName-opid=,cmd,stat例如:$ps-Csleep-opid=,cmd,statCMDSTAT9434sleep20S13.2.4實(shí)例:怎樣查看進(jìn)程通過(guò)前面章節(jié)的一些實(shí)例的學(xué)習(xí),想必你已經(jīng)知道了使用ps命令可以查看進(jìn)程的信息,但除了ps命令,我們還可以使用pstree命令和pgrep命令查看當(dāng)前進(jìn)程的信息。使用ps命令,可以查看當(dāng)前的進(jìn)程。默認(rèn)情況下,ps命令只會(huì)輸出當(dāng)前用戶(hù)并且是當(dāng)前終端(比如,當(dāng)前Shell)下調(diào)用的進(jìn)程的信息。13.2.5實(shí)例:向進(jìn)程發(fā)送信號(hào)我們可以使用鍵盤(pán)或pkill命令、kill命令和killall命令向進(jìn)程發(fā)送各種信號(hào)。在Bash下,我們可以使用鍵盤(pán)發(fā)送如下信號(hào)。組合鍵含義Ctrl+C中斷信號(hào),發(fā)送SIGINT信號(hào)到運(yùn)行在前臺(tái)的進(jìn)程Ctrl+Y延時(shí)掛起信號(hào),使運(yùn)行的進(jìn)程在嘗試從終端讀取輸入時(shí)停止??刂茩?quán)返回給Shell,使用戶(hù)可以將進(jìn)程放在前臺(tái)或后臺(tái),或殺掉該進(jìn)程Ctrl+Z掛起信號(hào),發(fā)送SIGTSTP信號(hào)到運(yùn)行的進(jìn)程,由此將其停止,并將控制權(quán)返回給Shell13.2.5實(shí)例:向進(jìn)程發(fā)送信號(hào)大多數(shù)主流的Shell,包括Bash,都有內(nèi)置的kill命令。Linux系統(tǒng)中,也有kill命令,即/bin/kill。如果使用/bin/kill,則系統(tǒng)可能會(huì)激活一些額外的選項(xiàng),比如,殺掉不是你自己的進(jìn)程,或指定進(jìn)程名作為參數(shù),類(lèi)似于pgrep和pkill命令。不過(guò)兩種kill命令默認(rèn)都是發(fā)送SIGTERM信號(hào)。當(dāng)準(zhǔn)備殺掉一個(gè)進(jìn)程或一連串的進(jìn)程時(shí),我們的常識(shí)是嘗試發(fā)送最安全的信號(hào)開(kāi)始,即SIGTERM信號(hào)。以這種方式,關(guān)心正常停止運(yùn)行的程序,當(dāng)它收到SIGTERM信號(hào)時(shí),有機(jī)會(huì)按照已經(jīng)設(shè)計(jì)好的流程執(zhí)行,比如,清理和關(guān)閉打開(kāi)的文件。如果你發(fā)送一個(gè)SIGKILL信號(hào)到進(jìn)程,你將消除進(jìn)程先清理而后關(guān)閉的機(jī)會(huì),而這可能會(huì)導(dǎo)致不幸的結(jié)果。但如果一個(gè)有序地終結(jié)不管用,那么發(fā)送SIGINT或SIGKILL信號(hào)就可能是唯一的方法了。例如,當(dāng)一個(gè)前臺(tái)進(jìn)程使用Ctrl+C殺不掉時(shí),那最好就使用命令“kill-9PID”了。13.2.5實(shí)例:向進(jìn)程發(fā)送信號(hào)kill命令可以發(fā)送多種信號(hào)到進(jìn)程。特別有用的信號(hào)包括:SIGHUP(1)SIGINT(2)SIGKILL(9)SIGCONT(18)SIGSTOP(19)在Bash中,信號(hào)名或信號(hào)值都可作為kill命令的選項(xiàng),而作業(yè)號(hào)或進(jìn)程號(hào)則作為kill命令的參數(shù)。13.2.6關(guān)于子Shell子Shell是由Shell或Shell腳本運(yùn)行的子進(jìn)程。當(dāng)你在Shell命令行提示符下,運(yùn)行一個(gè)Shell腳本時(shí),它會(huì)創(chuàng)建一個(gè)叫做子Shell的新進(jìn)程,你的腳本將會(huì)使用這個(gè)子Shell來(lái)運(yùn)行。子Shell是命令處理程序(提供給你命令行提示符的Shell或是一個(gè)xterm窗口)的一個(gè)單獨(dú)實(shí)例。就像你的命令在命令行提示符下被解釋?zhuān)?lèi)似地,腳本批處理一連串命令。實(shí)際上,每個(gè)運(yùn)行的Shell腳本都是父Shell的子進(jìn)程。Shell腳本可以自己?jiǎn)?dòng)子進(jìn)程。這些子Shell讓腳本可以做并行處理,實(shí)際上是同時(shí)執(zhí)行多個(gè)子任務(wù)。13.3捕獲到目前為止,我們?cè)诒緯?shū)所見(jiàn)的腳本中還沒(méi)有需要信號(hào)處理功能的,因?yàn)樗鼈兊膬?nèi)容相對(duì)比較簡(jiǎn)單,執(zhí)行時(shí)間很短,而且不會(huì)創(chuàng)建臨時(shí)文件。而對(duì)于較大的或者更復(fù)雜的腳本來(lái)說(shuō),如果腳本具有信號(hào)處理機(jī)制可能就比較有用了。當(dāng)我們?cè)O(shè)計(jì)一個(gè)大且復(fù)雜的腳本時(shí),考慮到當(dāng)腳本運(yùn)行時(shí)出現(xiàn)用戶(hù)退出或系統(tǒng)關(guān)機(jī)會(huì)發(fā)生什么,是很重要的。當(dāng)這樣的事件發(fā)生時(shí),一個(gè)信號(hào)將會(huì)發(fā)送到所有受影響的進(jìn)程。相應(yīng)地,這些進(jìn)程的程序可以采取一些措施以確保程序正常有序地終結(jié)。比如說(shuō),我們編寫(xiě)了一個(gè)會(huì)在執(zhí)行時(shí)生成臨時(shí)文件的腳本。在好的設(shè)計(jì)過(guò)程中,我們會(huì)讓腳本在執(zhí)行完成時(shí)刪除這些臨時(shí)文件。同樣聰明的做法是,如果腳本接收到了指示程序?qū)⑻崆敖Y(jié)束的信號(hào),也應(yīng)刪除這些臨時(shí)文件。接下來(lái),就讓我們開(kāi)始學(xué)習(xí),如何在腳本中進(jìn)行這些處理。13.3.1trap語(yǔ)句Bash的內(nèi)部命令trap,讓我們可以在Shell腳本內(nèi)捕獲特定的信號(hào)并對(duì)它們進(jìn)行處理。trap命令的語(yǔ)法如下所示:$trapcommandsignal[signal…]上述語(yǔ)法中,command可以是一個(gè)腳本或是一個(gè)函數(shù)。signal即可以用信號(hào)名,也可以用信號(hào)值指定。你可以不指定任何參數(shù),而直接使用trap命令,它將會(huì)打印與每個(gè)要捕獲的信號(hào)相關(guān)聯(lián)的命令的列表。13.3.1trap語(yǔ)句當(dāng)Shell收到信號(hào)signal(s)時(shí),command將被讀取和執(zhí)行。比如,如果signal是0或EXIT時(shí),command會(huì)在Shell退出時(shí)被執(zhí)行。如果signal是DEBUG時(shí),command會(huì)在每個(gè)命令后被執(zhí)行。signal也可以被指定為ERR,那么每當(dāng)一個(gè)命令以非0狀態(tài)退出時(shí),command就會(huì)被執(zhí)行(注意,當(dāng)非0退出狀態(tài)來(lái)自一個(gè)if語(yǔ)句部分,或來(lái)自while、until循環(huán)時(shí),command不會(huì)被執(zhí)行)。下面我們通過(guò)幾個(gè)簡(jiǎn)單的實(shí)例來(lái)學(xué)習(xí)trap命令的用法。13.3.2實(shí)例:使用trap語(yǔ)句捕獲信號(hào)通過(guò)前面內(nèi)容的學(xué)習(xí),我們已經(jīng)知道,信號(hào)多用于以友好的方式結(jié)束一個(gè)進(jìn)程的執(zhí)行,既允許進(jìn)程在退出之前有機(jī)會(huì)做一些清理工作。然而,信號(hào)同樣還可用于其它用途。例如,當(dāng)終端窗口的大小改變時(shí),在此窗口中運(yùn)行的Shell都會(huì)接收到信號(hào)SIGWINCH。通常,這個(gè)信號(hào)是被忽略的,但是,如果一個(gè)程序關(guān)心窗口大小的變化,它就可以捕獲這個(gè)信號(hào),并用特定的方式處理它。注意:除SIGKILL信號(hào)以外,其它任何信號(hào)都可以被捕獲并通過(guò)調(diào)用C函數(shù)signal處理。接下來(lái),我就以一個(gè)腳本為實(shí)例演示捕獲并處理SIGWINCH信號(hào)。13.3.3實(shí)例:移除捕獲如果我們?cè)谀_本中應(yīng)用了捕獲,我們通常會(huì)在腳本的結(jié)尾處,將接收到信號(hào)時(shí)的行為處理重置為默認(rèn)模式。重置(移除)捕獲的語(yǔ)法如下所示:$trap-signal[signal…]從上述語(yǔ)法中可以看出,使用破折號(hào)作為trap語(yǔ)句的命令參數(shù),就可以移除信號(hào)的捕獲。下面,我們以腳本trap_reset.sh為例,來(lái)學(xué)習(xí)如何在腳本中移除先前定義的捕獲。13.4小結(jié)下面我們總結(jié)一下本章所學(xué)的主要知識(shí):在Linux系統(tǒng)和其它類(lèi)Unix或Unix操作系統(tǒng)中,信號(hào)被用于進(jìn)程間的通訊。信號(hào)是一個(gè)發(fā)送到某個(gè)進(jìn)程或同一進(jìn)程中的特定線程的異步通知,用于通知發(fā)生的一個(gè)事件。在Linux中,信號(hào)在處理異常和中斷方面,扮演了極其重要的角色。當(dāng)一個(gè)事件發(fā)生時(shí),會(huì)產(chǎn)生一個(gè)信號(hào),然后內(nèi)核會(huì)將事件傳遞到接收的進(jìn)程。運(yùn)行在用戶(hù)模式下的進(jìn)程會(huì)接收信號(hào)。如果接收的進(jìn)程正運(yùn)行在內(nèi)核模式,那么信號(hào)的執(zhí)行只有在該進(jìn)程返回到用戶(hù)模式時(shí)才會(huì)開(kāi)始。13.4小結(jié)當(dāng)進(jìn)程收到一個(gè)信號(hào)時(shí),可能會(huì)發(fā)生以下三種情況:進(jìn)程可能會(huì)忽略此信號(hào)。有些信號(hào)不能被忽略,而有些沒(méi)有默認(rèn)行為的信號(hào),默認(rèn)會(huì)被忽略。進(jìn)程可能會(huì)捕獲此信號(hào),并執(zhí)行一個(gè)被稱(chēng)為信號(hào)處理器的特殊函數(shù)。進(jìn)程可能會(huì)執(zhí)行信號(hào)的默認(rèn)行為。例如,信號(hào)15(SIGTERM)的默認(rèn)行為是結(jié)束進(jìn)程。在Shell命令行提示符下,輸入“kill-l”命令,可以顯示所有信號(hào)的信號(hào)值和相應(yīng)的信號(hào)名。由Bash運(yùn)行的非內(nèi)部命令會(huì)使用Shell從其父進(jìn)程繼承的信號(hào)處理程序。默認(rèn)情況下,Shell接收到SIGHUP信號(hào)后會(huì)退出。在退出之前,一個(gè)交互式的Shell會(huì)向所有的作業(yè),不管是正在運(yùn)行的還是已停止的,重新發(fā)送SIGHUP
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)脫胎漆器行業(yè)應(yīng)用動(dòng)態(tài)與投資盈利研究報(bào)告
- 2025至2030中國(guó)胰島素樣生長(zhǎng)因子Ⅱ行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 農(nóng)業(yè)科技行業(yè)創(chuàng)新發(fā)展及投資機(jī)會(huì)研究報(bào)告
- 2025至2030中國(guó)翼式風(fēng)速表行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)羊肚菌種植行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)網(wǎng)絡(luò)連接三相智能水表行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國(guó)線束設(shè)備行業(yè)運(yùn)行動(dòng)態(tài)及投資前景展望報(bào)告
- 音樂(lè)課程創(chuàng)新心得體會(huì)
- 小型室內(nèi)裝飾施工流程指導(dǎo)
- 建筑工地平安家庭事跡材料范文
- GB 17051-2025二次供水設(shè)施衛(wèi)生規(guī)范
- 2025年廣西公需科目答案01
- JJF1033-2023計(jì)量標(biāo)準(zhǔn)考核規(guī)范
- 三級(jí)安全教育登記卡(新)
- 新教科版六下科學(xué)4-6《生命體中的化學(xué)變化》教案
- 2023高中學(xué)業(yè)水平合格性考試歷史重點(diǎn)知識(shí)點(diǎn)歸納總結(jié)(復(fù)習(xí)必背)
- 自然指數(shù)NatureIndex(NI)收錄的68種自然科學(xué)類(lèi)期刊
- 手術(shù)報(bào)告審批單
- 《專(zhuān)業(yè)導(dǎo)論光電信息科學(xué)與工程》教學(xué)大綱
- 廣東省湛江市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)
- 少兒美術(shù)國(guó)畫(huà)- 少兒希望 《紫藤課件》
評(píng)論
0/150
提交評(píng)論