引言:
北京時(shí)間:2023/6/13/19:07,伴隨著期末考的來臨,最近停課啦!無論是線上課,還是學(xué)校的課,開心,那這不是咱持續(xù)更文的好時(shí)候嘛,但是今天在學(xué)習(xí)相關(guān)C++知識時(shí),涉及到了線程相關(guān)知識,雖然能聽,但是聽起來就比較費(fèi)勁,所以我們要先暫停C++相關(guān)知識的學(xué)習(xí),轉(zhuǎn)而投向有關(guān)系統(tǒng)編程的學(xué)習(xí),因?yàn)橹挥性谙到y(tǒng)編程中,我們才可以深入的接觸到線程的概念,當(dāng)然由于系統(tǒng)編程相關(guān)知識我們已經(jīng)很久沒有更新了,所以現(xiàn)在腦子就是一片空白,哈哈哈!想要進(jìn)行轉(zhuǎn)換肯定是一個(gè)費(fèi)時(shí)且痛苦的過程,但,這也是沒有辦法的辦法,一定需要勇敢去面對,因?yàn)槿绻麤]有系統(tǒng)編程底層的知識,那么C++中學(xué)習(xí)有關(guān)底層知識,就會非常痛苦,長痛不如短痛,所以我毅然決然的準(zhǔn)備切換形態(tài),等我學(xué)成歸來,再去學(xué)習(xí)C++相關(guān)知識時(shí),就如同砍瓜切菜,所以接下來10篇博客左右的內(nèi)容都將是有關(guān)系統(tǒng)編程學(xué)習(xí),接下來我們就正式進(jìn)入該篇博客的正題,深入信號相關(guān)知識,雖然之前我們已經(jīng)學(xué)習(xí)過了信號有關(guān)知識,但是因?yàn)闀r(shí)間過去已經(jīng)很久了,該篇博客就重點(diǎn)在于回顧,So,gogogo!
回顧信號相關(guān)知識
1.什么是信號
同理,雖然在以前的博客中,我們已經(jīng)詳細(xì)的講解過了該部分知識,但是由于時(shí)間問題,對這部分知識的淡忘,已經(jīng)到達(dá)了一個(gè)新高度,所以如果我們想要承接這部分知識繼續(xù)向下學(xué)習(xí),那么就需要將之前學(xué)習(xí)的知識給回憶起來,所以我們正式進(jìn)入信號相關(guān)知識的學(xué)習(xí),回顧第一個(gè)問題,什么是信號?如下就是Linux系統(tǒng)下的所有信號:
如上圖所示,指令:kill -l
,可以看出在Linux系統(tǒng)中的信號和我們?nèi)粘I钪械男盘柌⒉灰粯?,對于日常生活中的信號,我們的理解一般是什么手機(jī)信號、WiFi信號之類,再抽象點(diǎn)可能是鬧鐘信號、上課信號、紅綠燈信號等!總而言之,生活中的信號沒有標(biāo)準(zhǔn)定義,站在不同的角度,任何事物都可以理解成信號。但,對于操作系統(tǒng)中的信號,存在著一套標(biāo)準(zhǔn),該標(biāo)準(zhǔn)由POSIX(可移植操作系統(tǒng)接口)指定,也就是這個(gè)世界那些第一口吃螃蟹的人定義的一個(gè)標(biāo)準(zhǔn),上述62個(gè)信號就是POSIX中定義的操作系統(tǒng)的信號標(biāo)準(zhǔn),其中規(guī)定了每個(gè)信號的含義和用途,但注意,此時(shí)操作系統(tǒng)中的信號還分為標(biāo)準(zhǔn)信號和實(shí)時(shí)信號,所以為了可以更好的深入了解它們,今天我們主要講解的是1~31號的標(biāo)準(zhǔn)信號,如下就是這些信號的含義和用途:
信號 | 功能 | 編號 |
---|---|---|
SIGHUP | 掛起信號,常用于重新讀取配置文件等操作 | 1 |
SIGINT | 中斷信號,通常由 Ctrl+C 觸發(fā),用于中斷進(jìn)程運(yùn)行 |
2 |
SIGQUIT | 退信,通常由 Ctrl+\ 觸發(fā),用于強(qiáng)制終止進(jìn)程并生成核心轉(zhuǎn)儲(core dump ) |
3 |
SIGILL | 非法指令異常信號,通常表示進(jìn)程執(zhí)行了非法、損壞或未知的指令 | 4 |
SIGTRAP | 調(diào)試陷阱信號,通用于調(diào)試器與進(jìn)程之間的交互 | 5 |
SIGABRT | 終止信號,由 abort() 庫函數(shù)或 assert() 宏觸發(fā),用于指示應(yīng)用程序遭遇了 unrecoverable 錯(cuò)誤并退出 |
6 |
SIGBUS | 總線錯(cuò)誤異常信號,通常表示進(jìn)程訪問了非法、損壞或未知的地址或內(nèi)存區(qū)域 | 7 |
SIGFPE | 浮點(diǎn)數(shù)異常信號,通常表示進(jìn)程嘗試對無效的浮點(diǎn)運(yùn)算進(jìn)行操作 | 8 |
SIGKILL | 終止信號,常用于強(qiáng)制終止非響應(yīng)的進(jìn)程 | 9 |
SIGUSR1 | 用戶定義信號1,通常用于向進(jìn)程發(fā)送自定義事件或命令 | 10 |
SIGSEGV | 段錯(cuò)誤異常信號,通常表示進(jìn)程嘗試訪問未分配或未授權(quán)的物理地址 | 11 |
SIGUSR2 | 用戶定義信號2,與 SIGUSR1 很相似,通常用于處理進(jìn)程特定的自定義事件 |
12 |
SIGPIPE | 管道信號,當(dāng)進(jìn)程向已關(guān)閉且無讀者的管道寫入數(shù)據(jù)時(shí)觸發(fā) | 13 |
SIGALRM | 鬧鐘信號,用于給進(jìn)程設(shè)置一個(gè)定時(shí)器,在指定時(shí)間后觸發(fā)信號 | 14 |
SIGTERM | 終止信號,通常用于請求正常終止進(jìn)程,并允許進(jìn)程有機(jī)會做清理和收尾工作 | 15 |
SIGSTKFLT | 協(xié)處理器堆棧異常信號,常見于數(shù)學(xué)協(xié)處理器出現(xiàn)錯(cuò)誤或不可恢復(fù)的問題時(shí) | 16 |
SIGCHLD | 子進(jìn)程狀態(tài)改變信號,子進(jìn)程退出或停止時(shí)會向父進(jìn)程發(fā)送此信號 | 17 |
SIGCONT | 繼續(xù)進(jìn)程信號,用于讓暫停的進(jìn)程恢復(fù)運(yùn)行 | 18 |
SIGSTOP | 停止信號,通常由 Ctrl+Z 觸發(fā),用于讓進(jìn)程暫停運(yùn)行并等待恢復(fù) |
19 |
SIGTSTP | 掛起或停止進(jìn)程信號,類似于 SIGSTOP ,但可以被捕獲、忽略或處理。 |
20 |
SIGTTIN | 在試圖從等待輸入的在后臺運(yùn)行的作業(yè)中讀數(shù)據(jù)時(shí)向作業(yè)發(fā)送的信號 | 21 |
SIGTTOU | 類似于SIGTTIN ,但是由寫入后臺進(jìn)程終端時(shí)發(fā)送 |
22 |
SIGURG | 帶外數(shù)據(jù)信號通知程序數(shù)據(jù)接收 | 23 |
SIGXCPU | 超出了允許的 CPU 時(shí)間限制 | 24 |
SIGXFSZ | 超出了允許的文件大小 | 25 |
SIGVTALRM | 虛擬鬧鐘信號. 觸發(fā)定時(shí)器與前面提到的 SIGALRM 不同的是,在本信號引起的定時(shí)器上不消耗系統(tǒng)時(shí)鐘資源,而且它可以使用setitimer() 函數(shù)間隔觸發(fā) |
26 |
SIGPROF | 類似于 SIGVTALRM ,但 SIGPROF 按照配置編譯所定義的計(jì)時(shí)器來測量可分配給進(jìn)程的處理器時(shí)間 |
27 |
SIGWINCH | 窗口改變信號;當(dāng)終端的寬度或高度發(fā)生變化時(shí),將向?yàn)樵摻K端打開并且正在執(zhí)行的所有進(jìn)程發(fā)出此信號 | 28 |
SIGIO | I/O 事件信號,常用于異步 I/O 操作 |
29 |
SIGPWR | 電源故障警告信號 | 30 |
SIGSYS | 報(bào)告非法系統(tǒng)調(diào)用 | 31 |
從上表中,我們可以知道每一個(gè)編號信號的功能和具體使用場景,知道在Linux系統(tǒng)中,無論是鍵盤輸入的各種快捷鍵還是各種Linux指令,本質(zhì)都是通過上述信號完成,并且因?yàn)?bash
(命令行解釋器)本質(zhì)是操作系統(tǒng)維護(hù)的一個(gè)子進(jìn)程,所以我們在使用指令完成各種操作時(shí),本質(zhì)就是在對進(jìn)程發(fā)送信號,只不過此時(shí)這個(gè)進(jìn)程可能是bash進(jìn)程,也可能是其它進(jìn)程, 所以簡單來說,操作系統(tǒng)中的信號就是用于通知進(jìn)程發(fā)生某個(gè)事件,是操作系統(tǒng)中一種傳遞信息的方式。
2.信號重點(diǎn)知識理解
第一個(gè)重點(diǎn):信號的產(chǎn)生是異步的,那么如何理解這個(gè)異步呢?
從現(xiàn)實(shí)生活中理解,某個(gè)老師,手機(jī)微信中收到一個(gè)教務(wù)處發(fā)布的緊急任務(wù)需要處理,該老師可能處于上課狀態(tài)也可能處于休閑狀態(tài),但無論該老師處于什么狀態(tài),都和教務(wù)處沒有關(guān)系,并不影響教務(wù)處向別的老師下達(dá)任務(wù)。同理,真正從信號的角度來看,那么類比,此時(shí)就是向某一個(gè)進(jìn)程發(fā)送信號,但是該進(jìn)程可能正處于運(yùn)行狀態(tài),但,我不管它是不是處于運(yùn)行狀態(tài),我的責(zé)任只是將信號發(fā)送給它,并且在我將信號發(fā)送給該進(jìn)程的同時(shí),并不影響我將信號發(fā)送給另一個(gè)進(jìn)程,這就是傳說中信號的產(chǎn)生是異步的,這樣處理的好處不言而喻,可以提高程序的并發(fā)性和響應(yīng)性,減少資源浪費(fèi),最重要的是可以保證程序的穩(wěn)定性和可靠性,簡單來說就是一但產(chǎn)生某個(gè)信號,就要第一時(shí)間發(fā)送給進(jìn)程,而不是阻塞!
第二個(gè)重點(diǎn):進(jìn)程如何記錄信號?記錄在哪里?也就是當(dāng)一個(gè)進(jìn)程同時(shí)接收到了多個(gè)信號,怎么處理?
同理,任何事物都具有關(guān)聯(lián)性,如果上述知識點(diǎn)是合理的、正確的,那么該問題的產(chǎn)生就是合理的不能再合理,因?yàn)樾盘柕漠a(chǎn)生是異步的,需要第一時(shí)間發(fā)送給進(jìn)程,那么就會導(dǎo)致某一個(gè)進(jìn)程在運(yùn)行過程中收到信號,那么這個(gè)信號肯定是不能丟失,而是需要保存下來,等待進(jìn)程處理。那么如何解決這個(gè)問題呢?簡簡單單,從以前有關(guān)進(jìn)程的知識,我們可以知道,一個(gè)進(jìn)程都有與其相對應(yīng)的進(jìn)程pcb(操作系統(tǒng)完成一系列創(chuàng)建工作),并且知道該進(jìn)程pcb本質(zhì)是一個(gè)task_struct,所以林子大了什么鳥都有,這個(gè)task_struct中存在一個(gè)專門用于記錄信號的位圖結(jié)構(gòu)( uint32_t signals),所以進(jìn)程就是通過這個(gè)位圖結(jié)構(gòu)實(shí)現(xiàn)對信號的存儲和管理。
第三個(gè)重點(diǎn):分時(shí)信號和實(shí)時(shí)信號的區(qū)別(1 ~ 31和32 ~ 64信號編號的區(qū)別)
想要明白這兩種信號的區(qū)別,首先明白,目前主流的操作系統(tǒng)分為兩種,一種是實(shí)時(shí)操作系統(tǒng),一種分時(shí)操作系統(tǒng),其中分時(shí)操作系統(tǒng),也就是我們正在使用的Linux操作系統(tǒng)、Windows操作系統(tǒng),它們的特點(diǎn)是:基于時(shí)間片,基于調(diào)度器調(diào)度,強(qiáng)調(diào)公平調(diào)度,均享資源的操作系統(tǒng)。而實(shí)時(shí)操作系統(tǒng),則是,如果來了一個(gè)任務(wù),那么就需要將優(yōu)先級較高的任務(wù)立馬處理,只有當(dāng)把優(yōu)先級高的任務(wù)處理完,才處理下一個(gè)任務(wù),特點(diǎn):高響應(yīng)(車載系統(tǒng)),明白了上述有關(guān)實(shí)時(shí)操作系統(tǒng)和分時(shí)操作系統(tǒng)的知識,此時(shí)實(shí)時(shí)信號和分時(shí)信號同理,這里不詳細(xì)講解。
第四個(gè)重點(diǎn):如何管理信號(1-31號)
上述在如何存儲信號之時(shí),我們已經(jīng)知道是使用位圖結(jié)構(gòu)來存儲信號,所以管理信號本質(zhì)就是在管理位圖結(jié)構(gòu),所以如何管理位圖結(jié)構(gòu)呢?如下:因?yàn)橹恍枰芾?~31號信號,所以我們使用32個(gè)比特位就可以很好的將31個(gè)信號都表示出來,注意:0000 0000 0000 0000 0000 0000 0000 0000 在這32個(gè)比特位中,不是通過二進(jìn)制序列對應(yīng)的10進(jìn)制數(shù)來決定是幾號信號,比特位所處位置的編號表示的就是信號編號,第一個(gè)比特位對應(yīng)一號信號,第二個(gè)比特位對應(yīng)二號信號,只有當(dāng)我們需要判斷該進(jìn)程pcb中的所有信號有哪些,此時(shí)才有可能通過計(jì)算該二進(jìn)制序列對應(yīng)的十進(jìn)制數(shù)來確定, 當(dāng)然也有可能是通過遍歷該二進(jìn)制序列或者是使用按位與、按位或來確定,具體需要看底層實(shí)現(xiàn)
第五個(gè)重點(diǎn):如何理解向進(jìn)程發(fā)送信號
通過對上述知識的理解,此時(shí)搞定這個(gè)問題,就是水到渠成,明白,信號在進(jìn)程pcb中是使用位圖結(jié)構(gòu)存儲,并且位圖結(jié)構(gòu)中比特位的位置和信號編號對應(yīng),所以所謂的向進(jìn)程發(fā)送信號,本質(zhì)其實(shí)就是向進(jìn)程pcb中的位圖結(jié)構(gòu)寫入信號,也就是直接將對應(yīng)進(jìn)程pcb中的位圖結(jié)構(gòu)特定的比特位從0置1,此之謂發(fā)送信號。并且最后明白,比特位的內(nèi)容代表是否收到該信號,0表示未收到,1表示收到。
第六個(gè)重點(diǎn):誰有資格修改進(jìn)程pcb中的位圖結(jié)構(gòu)?
在之前有關(guān)進(jìn)程相關(guān)知識理解,我們(用戶)想要?jiǎng)?chuàng)建一個(gè)進(jìn)程,就一定要去調(diào)用系統(tǒng)調(diào)用接口,從而讓操作系統(tǒng)去創(chuàng)建和維和對應(yīng)的進(jìn)程,并且操作系統(tǒng)每當(dāng)生成一個(gè)進(jìn)程都需要?jiǎng)?chuàng)建對應(yīng)進(jìn)程的進(jìn)程pcb,所以明白無論是進(jìn)程,還是進(jìn)程pcb都是內(nèi)核數(shù)據(jù),由操作系統(tǒng)管理,我們是摸不著,看不見的,因此進(jìn)程pcb中的位圖結(jié)構(gòu),同理只有操作系統(tǒng)有權(quán)利去修改,具體如何修改,在上述發(fā)送信號我們也簡單了解了。
最后明白,信號編號和信號本身只是宏定義而已,如下圖所示:當(dāng)然具體每個(gè)信號對應(yīng)的默認(rèn)執(zhí)行動作是什么,在系統(tǒng)調(diào)用接口中已經(jīng)幫我們封裝好了,并且?guī)臀覀儗?shí)現(xiàn)了一套映射機(jī)制,操作系統(tǒng)只要拿著對應(yīng)的信號編號(下標(biāo)),就可以去執(zhí)行對應(yīng)“信號處理程序表”
或者“信號向量表”
中對應(yīng)函數(shù)指針指向的函數(shù)(默認(rèn)執(zhí)行動作)
深入學(xué)習(xí)信號
上述回顧完信號相關(guān)基礎(chǔ)知識,此時(shí)正式深入信號,當(dāng)然前提是對上述知識有很好的理解,首先明白,當(dāng)進(jìn)程收到一個(gè)信號時(shí),進(jìn)程有三種處理方式,如下:(很關(guān)鍵)
1.執(zhí)行默認(rèn)動作
2.忽略信號
3.執(zhí)行自定義動作
最好的舉例:頭天晚上睡覺的時(shí)候,設(shè)置了一個(gè)第二天7點(diǎn)起床的鬧鐘,但是由于你睡的比較遲,所以當(dāng)鬧鐘響的時(shí)候,你可能直接將鬧鐘關(guān)閉,也可能是將鬧鐘往后延遲了20分鐘,當(dāng)然也可能是直接起床。上述日常生活場景,將進(jìn)程接收信號時(shí)的處理方式給展現(xiàn)的淋漓盡致,一眼就知道,如果你直接起床就是執(zhí)行默認(rèn)動作,如果你直接關(guān)閉就是忽略信號,如果你延后就是執(zhí)行自定義動作。明白了這個(gè)知識點(diǎn)之后,下述知識理解起來就較為容易啦!
進(jìn)程產(chǎn)生信號的方式
1.外設(shè)產(chǎn)生的信號
首先明白,外設(shè)產(chǎn)生的信號都稱為中斷信號,外設(shè)可以通過特殊的電路(中斷控制器)向硬件處理單元(CPU)發(fā)送中斷信號,所以當(dāng)外設(shè)產(chǎn)生信號時(shí),操作系統(tǒng)并不關(guān)心該信號對應(yīng)的數(shù)據(jù)是什么,而關(guān)心是那個(gè)外設(shè)觸發(fā)中斷控制器發(fā)送的中斷信號,并且明白,該過程是一個(gè)產(chǎn)生信號過程,不是操作系統(tǒng)發(fā)送信號過程,此時(shí)信號的產(chǎn)生是通過CPU上許許多多的針腳,來接收外設(shè)通過中斷控制器發(fā)送過來的信號(電脈沖),并且當(dāng)某個(gè)針腳接收到電脈沖之后,通過檢測對應(yīng)針腳是否處于高電頻,來判斷具體是那一個(gè)針腳接收到了信號(存在映射關(guān)系),并且將該針腳對應(yīng)的編號寫入到CPU的寄存器中,最終通過針腳對應(yīng)的編號找到“中斷向量表”
中對應(yīng)函數(shù)指針指向的默認(rèn)動作,具體如下圖所示:
最后明白,對應(yīng)函數(shù)指針的默認(rèn)動作是由操作系統(tǒng)管理,操作系統(tǒng)通過調(diào)用對應(yīng)外設(shè)驅(qū)動程序在操作系統(tǒng)內(nèi)部相對應(yīng)的中斷處理程序來處理,而不是直接的映射關(guān)系,并且當(dāng)匹配完成之后,那么操作系統(tǒng)就會將產(chǎn)生的信號,發(fā)送給對應(yīng)的進(jìn)程(修改其對應(yīng)的位圖結(jié)構(gòu)),最終通過進(jìn)程執(zhí)行某個(gè)動作,實(shí)現(xiàn)預(yù)期想要達(dá)到的效果。
2.通過系統(tǒng)接口發(fā)送信號
首先明白,可以向進(jìn)程發(fā)送信號的系統(tǒng)調(diào)用接口很多,如:kill、raise、alarm、signal、sigqueue、pkill
,這些接口各有各的特性,使用方式也有很大的不同,具體如何使用可以去查看具體的說明,這里我們主要介紹兩個(gè)向進(jìn)程發(fā)送信號的接口:kill
和signal
,剩下的簡單了解就行,如下所述:
kill接口:
首先明白,kill接口可以向指定進(jìn)程發(fā)送信號,具體使用方式: int kill(pid_t pid, int sig);
該接口兩個(gè)參數(shù),第一個(gè)參數(shù)表示指定進(jìn)程的pid,第二個(gè)參數(shù)表示對應(yīng)發(fā)送的信號編號,所以表示的意思也就是向指定進(jìn)程發(fā)送對應(yīng)編號的信號,如下代碼所示,我們就可通過調(diào)用該kill接口,封裝出一個(gè)屬于自己的kill接口,如下:
上述代碼,我們就自己實(shí)現(xiàn)了一個(gè)kill程序,此時(shí)利用該程序就可以殺死任意進(jìn)程,當(dāng)然前提第是環(huán)境變量表中的第二個(gè)參數(shù)給的是9號信號,因?yàn)?號信號不允許你自定義捕捉(也就是更改它的默認(rèn)動作),所以9號信號也叫管理員信號,并且明白之所以除了9號信號外,別的信號都支持修改默認(rèn)動作,是因?yàn)橛衧ignal系統(tǒng)調(diào)用接口,允許你修改默認(rèn)動作,執(zhí)行自定義動作,具體如下所述:
signal接口:
據(jù)上述所說,此時(shí)明白,signal接口的作用就是更改某個(gè)信號的默認(rèn)執(zhí)行動作為自定義動作,具體使用方式:sighandler_t signal(int signum, sighandler_t handler);
,分析可知,第一個(gè)參數(shù)是對應(yīng)的信號編號,第二個(gè)參數(shù)是一個(gè)函數(shù)指針(也就是自定義方法),如下代碼所示:
此時(shí)發(fā)現(xiàn),給該程序發(fā)送2號信號已經(jīng)不能將其終止了,并且發(fā)送2號信號后,該程序還會去執(zhí)行對應(yīng)的打印動作,這就說明,我們的signal接口成功的將2號信號的默認(rèn)動作給修改啦!如果深入理解該接口的話,本質(zhì)還是涉及相關(guān)映射問題,和上述所說同理,就是對應(yīng)的信號編號和默認(rèn)動作存在一定的映射關(guān)系,也就是操作系統(tǒng)會維護(hù)一個(gè)函數(shù)指針數(shù)組,操作系統(tǒng)通過對應(yīng)的信號編號和對應(yīng)函數(shù)指針數(shù)組的映射關(guān)系,找到對應(yīng)的默認(rèn)動作,所以signal接口將默認(rèn)動作改為的自定義動作的本質(zhì)就是更改對應(yīng)的映射關(guān)系而已,具體原理有待分析,這里不詳細(xì)講解!
剩余向進(jìn)程發(fā)送信號接口:
raise函數(shù)
:用于將指定信號發(fā)送給當(dāng)前進(jìn)程alarm函數(shù)
:用于設(shè)置一個(gè)定時(shí)器,在指定時(shí)間后發(fā)送SIGALRM信號abort函數(shù)
:用于在程序中異常終止執(zhí)行,調(diào)用abort函數(shù)會向程序發(fā)送SIGABRT信號,使得程序立即停止運(yùn)行并且產(chǎn)生core dump文件killall命令
:用于向所有同名進(jìn)程(由進(jìn)程名指定)發(fā)送指定的信號。killall命令可以在終端上使用pkill命令
:根據(jù)指定的進(jìn)程名或其他條件(例如用戶ID、會話ID)查找匹配進(jìn)程,并向其發(fā)送指定的信號,pkill命令也可以在終端上使用sigqueue函數(shù)
:與kill函數(shù)類似,不過可以向進(jìn)程發(fā)送一個(gè)帶數(shù)據(jù)的信號
3.發(fā)送信號重點(diǎn)知識理解
搞定了上述兩點(diǎn)知識,剩下的知識就沒那么重要了,在之前博客中寫過,這里就不再贅述。下面,我們來看看幾個(gè)對于發(fā)送信號很關(guān)鍵的點(diǎn),如下:
什么是終端
終端就是一個(gè)計(jì)算機(jī)系統(tǒng)中連接到操作系統(tǒng)的命令行界面,通過這個(gè)界面我們就可以是實(shí)現(xiàn)直接和操作系統(tǒng)進(jìn)行交互,當(dāng)然首先交互的方式是通過指令的形式,因?yàn)橹噶畹谋举|(zhì)就是文件,操作系統(tǒng)可以通過我們的指令去識別到各個(gè)文件,從而執(zhí)行文件中對應(yīng)的操作,進(jìn)行達(dá)到用于的預(yù)期。
前臺進(jìn)程和后臺進(jìn)程區(qū)分
Ctrl+c產(chǎn)生的信號只能發(fā)送給前臺進(jìn)程,一個(gè)命令后面加個(gè)&
,就表示后臺進(jìn)程,這樣Shell不必等待進(jìn)程結(jié)束就可以接收新的命令,啟動新的進(jìn)程(說白了就是有&就是后臺進(jìn)行,沒有&就是前臺進(jìn)程),Shell可以同時(shí)運(yùn)行一個(gè)前臺進(jìn)程和任意多個(gè)后臺進(jìn)程,只有前臺進(jìn)程才能接收像Ctrl+c這種控制鍵產(chǎn)生的信號(也就是后臺進(jìn)程不能使用快捷鍵殺死,而是只能用Linux指令,發(fā)送特定的信號才能殺死),而前臺進(jìn)程可以直接用Ctrl+c這種控制鍵殺死。
總之:前臺進(jìn)程就是用來和用戶進(jìn)行交互使用的,而后臺進(jìn)程則是操作系統(tǒng)控制的進(jìn)程,注重的是效率和資源利用率。
文章來源:http://www.zghlxwxcb.cn/news/detail-486072.html
程序?qū)氲江h(huán)境變量中
注意:上述對kill系統(tǒng)調(diào)用接口的封裝,是可以直接導(dǎo)入到我們的環(huán)境變量中(export
),然后就可以直接使用,也就是不需要使用./
使用,從這個(gè)方面,我們更加可以驗(yàn)證,軟件的底層一定要調(diào)用系統(tǒng)調(diào)用接口(kill),充分表明,只有操作系統(tǒng)可以控制進(jìn)程,用戶只能借助操作系統(tǒng)去控制進(jìn)程。文章來源地址http://www.zghlxwxcb.cn/news/detail-486072.html
總結(jié):上述就是有關(guān)信號基礎(chǔ)知識的復(fù)習(xí)和信號深入理解知識的總結(jié)概括,在之前博客的基礎(chǔ)上,增加了更為詳細(xì)的理解,總結(jié)的也更為精煉,收獲還是很大的,所以信號相關(guān)知識,我們算是回憶的比較深刻了,下篇博客看我砍瓜切菜!See you!
到了這里,關(guān)于學(xué)習(xí)系統(tǒng)編程N(yùn)o.24【深入學(xué)習(xí)信號】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!