国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux——進程信號的發(fā)送

這篇具有很好參考價值的文章主要介紹了Linux——進程信號的發(fā)送。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一.信號發(fā)送的概念

首先來講幾個發(fā)送術(shù)語:

它有三種情況:

?注意:

二.信號在內(nèi)核中的表示示意圖

三.信號捕捉

?所以總結(jié)一下:

此時,會出現(xiàn)這樣一個疑問:操作系統(tǒng)是如何得知現(xiàn)在被執(zhí)行的進程是用戶態(tài)還是內(nèi)核態(tài)?

問題2:CPU在執(zhí)行某個進程時是如何跑到操作系統(tǒng)中執(zhí)行代碼的呢?

用戶態(tài)的進程想要轉(zhuǎn)換為內(nèi)核態(tài)的情況大致有3種:

如下為進程的兩種狀態(tài)轉(zhuǎn)換圖:

? ? ? ? ?關(guān)于第三步有人就會問了,為什么內(nèi)核態(tài)的進程不能夠去執(zhí)行handler方法,而是還要變成用戶態(tài)才去執(zhí)行?

? ? ? ?

????????關(guān)于第三步完成后,調(diào)用handler表中的方法后,為什么不就在用戶態(tài)中繼續(xù)往下執(zhí)行,還要再回一次內(nèi)核態(tài)?


????????在上一篇博客中,我以列舉生活中的例子為基礎(chǔ),介紹了對信號的理解,信號的4個重點知識,信號的4種產(chǎn)生方式,且信號只能由操作系統(tǒng)發(fā)送給進程......

? ? ? ? 接下來,我繼續(xù)來詳解一下操作系統(tǒng)是怎么將信號發(fā)送出去的!

一.信號發(fā)送的概念

首先來講幾個發(fā)送術(shù)語:

1.實際執(zhí)行信號的處理動作稱為信號遞達(Delivery);

2.信號從產(chǎn)生到遞達之間的狀態(tài),稱為信號未決(Pending);

3.對于操作系統(tǒng)發(fā)送來的信號,進程可以選擇阻塞(Block) 該信號。

????????

????????對于信號遞達的理解:——是指進程收到信號后將其處理時的動作!所以進程在執(zhí)行遞達時,有三種方式可供選擇:

1.執(zhí)行默認(rèn)處理;

2.自定義處理(例如:采用signal函數(shù),做想要做的行為);

3.忽略操作(默認(rèn)不管)?

? ? ? ? 信號的產(chǎn)生(可以是由鍵盤的手動產(chǎn)生:ctrl+c、可以是系統(tǒng)調(diào)用kill()函數(shù)產(chǎn)生、可以是硬件異常產(chǎn)生:除零錯誤和段錯誤等、也可以是軟件條件產(chǎn)生的信號:讀端關(guān)閉寫端仍開),所以信號在被OS操作系統(tǒng)指定目標(biāo)進程發(fā)送開始到進程接收信號的這段時間稱之為信號未決。

它有三種情況:

1.操作系統(tǒng)向進程發(fā)送了信號,進程收到了信號還沒來得及處理,該進程可能在做著更重要的事情;

2.操作系統(tǒng)向進程發(fā)送了信號,在此途中,進程并沒收到信號;

3.操作系統(tǒng)向進程發(fā)送了信號,進程收到了信號,但提前進行了對該信號阻塞,導(dǎo)致進程無法遞達處理該信號。

?注意:

????????被阻塞的信號產(chǎn)生時將保持在未決狀態(tài),直到進程解除對此信號的阻塞,進程才會執(zhí)行遞達動作;

? ? ? ? 阻塞和忽略是不同的,只要信號被阻塞,那么意味著進程永遠不能遞達(處理)這個信號;而忽略是進程遞達(處理)這個信號的一種方式。

Linux——進程信號的發(fā)送,Linux,linux,運維

? ? ? ?上圖就好比一塊電路板,我們打開了電源,插座也插上了燈泡接口,但燈就是不亮,原因在于燈泡中的保險絲已經(jīng)在通電前就被熔斷了——保險絲的熔斷阻塞了電流通向燈泡的道路。


進程進行默認(rèn)處理信號的案例:

Linux——進程信號的發(fā)送,Linux,linux,運維

?該進程的執(zhí)行方式就是采用默認(rèn)的動作,遇到錯誤就立即終止退出。

進程進行自定義處理信號的案例:

Linux——進程信號的發(fā)送,Linux,linux,運維

?????????進程所作的遞達動作是:自定義方式,該方式是通過調(diào)用signal函數(shù),然后執(zhí)行該函數(shù)的第二參數(shù)——回調(diào)函數(shù),進而對該信號所想做的一些事情——Checksig();

忽略動作就不展示了......

所以對于信號遞達、信號未決、阻塞等術(shù)語還不理解的朋友們來看下面這個例子:

????????小明是個初中生,當(dāng)晚自習(xí)快結(jié)束時,班主任兼物理老師因為家中有急事,給同學(xué)們布置了一套卷子,他把卷子放講臺上并讓同學(xué)們下了自習(xí)拿回家做,就急著走了。同學(xué)們都記下了這件事,等到下課,小明并沒有拿上卷子,轉(zhuǎn)身就騎車回了家。他這么做的原因在于:上次期中考試時,他的物理成績考的不像樣子,被班主任劈頭蓋臉的罵了一頓,他心生怨恨,根本不想寫與物理有關(guān)的一切作業(yè)。

? ? ? ? 根據(jù)上面這個例子可知:小明相當(dāng)于進程,班主任是OS操作系統(tǒng),是小明的管理者,班主任讓小明拿卷子回家做(OS發(fā)送信號給進程),小明故意沒有拿(進程阻塞了信號的傳遞),小明只要一直怨恨著班主任,他就一直不做物理卷子(阻塞導(dǎo)致進程無法遞達該信號)。

? ? ? ? 這種情況就屬于阻塞——信號未決的其中一種情況;

????????信號未決的第二種表示情況: 小明拿到了物理卷子,但是回家路上出車禍了,住進醫(yī)院導(dǎo)致沒來得及做卷子;

? ? ? ? 信號未決的第三種表示情況:老師正要把卷子放到了講臺,還沒告知同學(xué)們的時候,地震了,老師和同學(xué)們就都走了。

????????而遞達表示:物理老師當(dāng)天下午又叫小明談話,這一次他倆冰釋前嫌(沒了阻塞),晚上發(fā)了卷子后,小明拿了物理卷子,回家認(rèn)認(rèn)真真做完(遞達的默認(rèn)動作);

????????遞達的忽略:小明拿了物理卷子,回家后由于數(shù)學(xué)英語作業(yè)明天要講,導(dǎo)致他沒時間做物理卷子;

????????遞達的自定義:小明拿了物理卷子,回家后開始做卷子,但由于上課沒有好好聽,導(dǎo)致很多題不會做,瞎寫答案。


二.信號在內(nèi)核中的表示示意圖

Linux——進程信號的發(fā)送,Linux,linux,運維

?根據(jù)上圖,做出以下理解:

? ? ? ? 操作系統(tǒng)在指定目標(biāo)進程后向該進程發(fā)送信號,緊接著該進程的PCB(進程控制塊),它的底層內(nèi)核數(shù)據(jù)結(jié)構(gòu):task_struct中的pending(位圖結(jié)構(gòu))、block(位圖結(jié)構(gòu))、handler(函數(shù)指針數(shù)組)三個屬性就會被激活。

Linux——進程信號的發(fā)送,Linux,linux,運維

? ? ? ? 先來看前兩個屬性,pending未決位圖和block阻塞位圖,兩個位圖結(jié)構(gòu)的底層都是由32比特位形成,從右往左由低到高。這32比特位默認(rèn)情況下都為0;每個比特位都代表了一個信號,例如兩個位圖最右邊的那個比特位是第一比特位,該比特位指的是1號信號,往左依次為2號信號、3號信號.....到第31號信號。

? ? ? ? pending未決位圖的作用是顯示:OS發(fā)送的信號是否被進程所處理。舉個例子:由于進程在執(zhí)行過程中出現(xiàn)了非法錯誤,使得OS查出錯誤后向該進程發(fā)送了4號信號,該進程的pending位圖中從右往左第4個比特位由0--->1,直到該進程收到4號信號并開始處理這4號信號時,pending位圖的比特位才會由1-->0。

? ? ? ? block阻塞位圖的作用是顯示:OS發(fā)送的信號是否已被進程所阻塞。舉個例子:OS向指定進程發(fā)送4號信號,進程提前設(shè)置阻塞位圖的第4比特位0--->1,該進程收到信號后無法處理4號信號。什么時候進程解除了阻塞,block阻塞位圖的第4比特位什么時候才會由1--->0。

Linux——進程信號的發(fā)送,Linux,linux,運維

????????接下來就是第三個屬性——handler表,handler是一個函數(shù)指針數(shù)組,在該數(shù)組中,數(shù)組的下標(biāo)表示信號的編號,例如數(shù)組下標(biāo)0標(biāo)識為1號信號......;數(shù)組元素的內(nèi)容代表著對應(yīng)信號的處理方法,當(dāng)我們訪問數(shù)組中的[0]、[1]、[2]時,訪問的是handler的函數(shù)指針,每一個函數(shù)指針都指向?qū)?yīng)信號的處理方法。

? ? ? ? 當(dāng)我們來到handler時,已經(jīng)能夠表明進程已經(jīng)成功收到了操作系統(tǒng)發(fā)來的信號,并正在對其進行遞達處理,上面說過,遞達分為三種方式:默認(rèn)、忽略、自定義。在下面這個內(nèi)核圖中:

Linux——進程信號的發(fā)送,Linux,linux,運維????????第一行的SIGUP信號,它的處理方式為:SIG_DFL(默認(rèn)處理——宏定義),意味著handler[0]的內(nèi)容寫的是SIG_DFL函數(shù)(立即終止進程,并退出);第二行SIGINT信號(2號信號),它的處理方式是SIG_IGN(忽略動作——宏定義),意味著handler[1]的內(nèi)容寫的是SIG_IGN的方式,對該信號的處理方式是不處理。而第三行SIGQUIT信號(3號信號),它的處理方式為用戶自己寫的自定義方法signal(signo,sighandler)函數(shù),意味著handler[2]中填入的內(nèi)容是用戶采用sighandler函數(shù)的函數(shù)地址。

? ? ? ? ?在這里考慮一種特殊情況:當(dāng)一個進程收到了OS發(fā)送來的多個信號時,由于進程只記錄一個,所以pending位圖一次只能置一個比特位,剩下的信號就會被丟棄。

? ? ? ? 注:上面這種情況只針對普通信號的發(fā)送,而對于實時信號的發(fā)送(Linux中第34——第64號信號),進程會對這些信號組成一個隊列,該隊列會保存這些信號的屬性信息,等待進程一個一個的處理。


三.信號捕捉

????????當(dāng)進程收到信號時,進程不會立即處理,而是在“合適的時候”。這個合適的時候是指:從內(nèi)核態(tài)返回用戶態(tài)時,進程才會進行處理。

Linux——進程信號的發(fā)送,Linux,linux,運維

???????用戶想要訪問上圖的兩種資源,就必須采用系統(tǒng)調(diào)用函數(shù),系統(tǒng)調(diào)用是操作系統(tǒng)給用戶提供的接口。普通用戶無法以自己用戶態(tài)的身份去訪問系統(tǒng)調(diào)用資源,得先讓自己的狀態(tài)變成內(nèi)核態(tài)才能執(zhí)行。

? ? ? ? 詳解如下:

????????1.當(dāng)CPU執(zhí)行進程自己的代碼時,進程當(dāng)前處于用戶態(tài),直到CPU執(zhí)行了系統(tǒng)調(diào)用函數(shù)(open、getpid、fork)等,進程就必須轉(zhuǎn)換為內(nèi)核態(tài),因為這些接口是屬于OS的,CPU想要訪問別人的資源,就得提升到能和別人平起平坐的身份才有資格。所以狀態(tài)的轉(zhuǎn)換是必然的。

? ? ? ? 在轉(zhuǎn)入內(nèi)核態(tài)后,CPU就可以訪問系統(tǒng)的資源了,這時代碼中有open函數(shù),于是CPU開始訪問該函數(shù),好比它在門外敲了敲open,請求open的幫罵,OS知道后將open的底層實現(xiàn)代碼拷貝了一份給CPU。

? ? ? ? 即使你的身份是內(nèi)核態(tài),但操作系統(tǒng)不相信任何人,它只相信它自己!你的身份是用戶態(tài)便沒有訪問需求的資格;當(dāng)你是內(nèi)核態(tài),有了資格也無法親自訪問,操作系統(tǒng)怕你亂搞,于是它幫你拷貝相應(yīng)函數(shù)的代碼給你。

? ? ? ? 需要注意的是:這里只是做了狀態(tài)轉(zhuǎn)換,訪問系統(tǒng)接口的人仍然是CPU,只不過身份變了而已。

????????2.CPU執(zhí)行系統(tǒng)調(diào)用是費時間的,因為有狀態(tài)的來回轉(zhuǎn)換,會導(dǎo)致執(zhí)行效率降低,所以盡量不要頻繁的采用系統(tǒng)調(diào)用!而自己寫的函數(shù)往往比函數(shù)調(diào)用要更快。

?所以總結(jié)一下:

用戶態(tài):正在執(zhí)行用戶層的代碼,此時進程的狀態(tài)是用戶態(tài).

內(nèi)核態(tài):正在通過系統(tǒng)調(diào)用訪問內(nèi)核、硬件資源,此時進程的狀態(tài)是內(nèi)核態(tài)。


此時,會出現(xiàn)這樣一個疑問:操作系統(tǒng)是如何得知現(xiàn)在被執(zhí)行的進程是用戶態(tài)還是內(nèi)核態(tài)?

Linux——進程信號的發(fā)送,Linux,linux,運維

????????在CPU中有一套寄存器,寄存器中存放著進程執(zhí)行代碼的數(shù)據(jù),之前說過多個磁盤文件被加載到內(nèi)存后,會被放進運行隊列中,計算機之所以能夠并發(fā)執(zhí)行多個程序,就是通過時間片輪轉(zhuǎn)的方式,讓cpu一段時間內(nèi)執(zhí)行進程A,一段時間執(zhí)行進程B,而寄存器的作用不僅僅用來處理計算,還用來保存上一個進程A被換下后的上下文數(shù)據(jù),以遍下次cpu再次執(zhí)行進程A時,能夠瞬間找到上次末尾的位置繼續(xù)運行該進程。

? ? ? ? 而在上圖中,某寄存器1用來存放當(dāng)前被執(zhí)行進程的PCB地址;某寄存器2用來存放該進程的頁表(虛擬空間中數(shù)據(jù)的虛擬地址可通過頁表映射內(nèi)存的物理地址)地址;而CR3寄存器的作用是表證當(dāng)前進程的運行級別:

若CR3寄存器為0,表示該進程當(dāng)前是內(nèi)核態(tài)(高級別);

若CR3寄存器為3,表示該進程當(dāng)前是用戶態(tài)(低級別);

?有了CR3寄存器,OS就可以輕易的知道每個進程當(dāng)前的運行級別是什么狀態(tài)的!

問題2:CPU在執(zhí)行某個進程時是如何跑到操作系統(tǒng)中執(zhí)行代碼的呢?

Linux——進程信號的發(fā)送,Linux,linux,運維

? ? ?

? ??????從上圖看,進程被加載到內(nèi)存后,其PCB(task struct)就會被CPU執(zhí)行。之前學(xué)習(xí)進程的時候就解釋過上圖,當(dāng)CPU執(zhí)行進程的代碼時,PCB(task struct)中的屬性指針會指向進程虛擬的地址空間,里面會存放代碼中數(shù)據(jù)的虎擬地址,當(dāng)CPU訪問到某個變量的慮擬地址后,需要通過頁表找到物理內(nèi)存中的該變量的物理地址,找到后將數(shù)據(jù)返回給CPU。這里說的慮擬地址空間中共有4GB大小,其中從低到高 第0到第3GB的空間為用戶級空間,用來存放用戶的代碼,數(shù)據(jù)等。為了保證進程的獨立性,每個進程都有一個進程地址空間,都有一個用戶級頁表。
????????第3-第4GB的空間為內(nèi)核空間,那么相對應(yīng)的也有一份內(nèi)核級頁表,該內(nèi)核級頁表是操作系統(tǒng)的,操作系統(tǒng)只有一個,所以是所有的進程共用這獨一份內(nèi)核級頁表。
????????其次內(nèi)核空間也是不允許用戶訪問的,因為這1GB空間中的數(shù)據(jù)是通過內(nèi)核級頁表和內(nèi)存中的操作系統(tǒng)相映射,屬于內(nèi)核級別的。因為內(nèi)存中只存在一份內(nèi)核,那么所有進程的虛擬地址空間中這1GB的內(nèi)核空間都通過同一份內(nèi)核級頁表和內(nèi)存中的內(nèi)核相映射。?

? ? ? ? 即每一個進程地址空間中的內(nèi)核空間都是一樣的,因為它們都通過同一個內(nèi)核級頁表和內(nèi)存中的OS相互映射。

? ? ? ? 有了以上這些知識的鋪墊,我們就可以理解CPU是如何跑到OS中訪問其資源的:

? ? ? ? 首先用戶寫了一份代碼,CPU將其運行,現(xiàn)狀態(tài)為用戶態(tài),在CPU執(zhí)行的代碼中有了系統(tǒng)調(diào)用接口,在CPU調(diào)用系統(tǒng)接口時進程轉(zhuǎn)換為內(nèi)核態(tài),CPU寄存器CR3的值自動轉(zhuǎn)換為0,OS發(fā)現(xiàn)該進程的CR3為0,驗證成功,允許CPU訪問系統(tǒng)資源,且CPU自動從進程地址空間的用戶空間跳轉(zhuǎn)到內(nèi)核空間,從而申請系統(tǒng)資源進行訪問,因為此時訪問的還是接口的虛擬地址,需要通過內(nèi)核級頁表去映射內(nèi)存中相應(yīng)的物理地址,最終找到后返回CPU。調(diào)用完系統(tǒng)接口后,CPU再回到用戶空間繼續(xù)執(zhí)行下面的代碼。? ? ??

? ? ??


用戶態(tài)的進程想要轉(zhuǎn)換為內(nèi)核態(tài)的情況大致有3種:

1.執(zhí)行系統(tǒng)調(diào)用函數(shù);

2.進程在執(zhí)行過程種出現(xiàn)了中斷、異常、缺陷;

3.進程之間的相互切換

解析:執(zhí)行系統(tǒng)調(diào)用上面已經(jīng)說的很清楚了;
????????對于第2點,進程出現(xiàn)了中斷異常,即表明CPU在執(zhí)行代碼過程發(fā)現(xiàn)了代碼上的錯誤(越界,除零...)然后報告給OS,OS根據(jù)錯誤向進程發(fā)送信號......當(dāng)進程出現(xiàn)中斷時,進程由用戶態(tài)轉(zhuǎn)換為內(nèi)核態(tài),然后操作系統(tǒng)成為執(zhí)行者,之后才能做一系列的操作(查出錯誤、發(fā)送信號),發(fā)送完后進程再轉(zhuǎn)換為用戶態(tài),然后根據(jù)發(fā)來的信號對出現(xiàn)中斷,異常的地方進行處理,處理完后繼續(xù)往下執(zhí)行代碼。
????????對于第三點進程切換,說自了比如有3個程序被加載到內(nèi)存成為進程,這三個進程被OS放進運行隊列中,CPU通過時間片輪轉(zhuǎn)的方式依次執(zhí)行這三個進程,當(dāng)一個進程被CPU執(zhí)行時,該進程轉(zhuǎn)為用戶態(tài),執(zhí)行用戶寫的代碼,執(zhí)行幾秒后,該進程被轉(zhuǎn)換為內(nèi)核態(tài),被操作系統(tǒng)從CPU中剝離到運行隊列,等待下一次的運行。等到下一次再被CPU執(zhí)行時,再轉(zhuǎn)為運行態(tài)...

如下為進程的兩種狀態(tài)轉(zhuǎn)換圖:

Linux——進程信號的發(fā)送,Linux,linux,運維?

順序如下:?

第一步:用戶態(tài)進程的CPU需要訪問open系統(tǒng)調(diào)用函數(shù)時,轉(zhuǎn)入內(nèi)核態(tài)訪問。

第二步:從用戶空間跳轉(zhuǎn)到內(nèi)核空間后,訪問到open函數(shù)的虛擬地址,再通過內(nèi)核級頁表訪問到該函數(shù)的物理地址。緊接著CPU通過進程的兩個位圖和handler數(shù)組表,查看有沒有信號遞達。

第三步:在檢查的過程中第四行的信號正處于未決狀態(tài),handler表中采用的是自定義方式處理(這時進程仍是內(nèi)核態(tài)),自定義方式為signal(signo, handler)函數(shù)調(diào)用,進程需要轉(zhuǎn)換為用戶態(tài)去執(zhí)行signal方法。

? ? ? ? ?關(guān)于第三步有人就會問了,為什么內(nèi)核態(tài)的進程不能夠去執(zhí)行handler方法,而是還要變成用戶態(tài)才去執(zhí)行?

? ? ? ? 在理論上,內(nèi)核態(tài)進程是完全可以執(zhí)行signal函數(shù)的,但在實際操作上是不被允許的,原因在于:操作系統(tǒng)不相信任何人,萬一用戶寫的代碼是惡意的、非法代碼,用內(nèi)核態(tài)(被操作系統(tǒng)任何)的身份去執(zhí)行,就會導(dǎo)致安全問題。所以必須經(jīng)過特定的方式切換到用戶態(tài)身份去執(zhí)行自定義處理的方式才能保證系統(tǒng)的安全。

第四步:執(zhí)行完signal方法后,需要帶著數(shù)據(jù)再轉(zhuǎn)換回內(nèi)核態(tài),此時,檢查信號是否遞達的工作已然做完。

第五步:進程返回用戶態(tài),繼續(xù)執(zhí)行open()函數(shù)之后的代碼。

? ? ? ?
????????關(guān)于第三步完成后,調(diào)用handler表中的方法后,為什么不就在用戶態(tài)中繼續(xù)往下執(zhí)行,還要再回一次內(nèi)核態(tài)?

????????原因:因為進程的上下文信息是系統(tǒng)保存的,是緊密相關(guān)的,進程不能由一種狀態(tài)直接跳回另一種狀態(tài),這時需要操作系統(tǒng)幫助才能的,需要操作系統(tǒng)就得讓進程經(jīng)過特定的方式回到內(nèi)核態(tài)。

簡化上圖的過程:?

Linux——進程信號的發(fā)送,Linux,linux,運維

???????綠色圓圈表示進程的兩種身份的切換,共有4次。上圖可以看成是一個無窮大的符號。線上的是用戶態(tài),線下的是內(nèi)核態(tài)。

? ? ? ? 況且上面這種是進程狀態(tài)轉(zhuǎn)換最復(fù)雜的情況,因為是自定義的操作,第三步和第四步的過程就導(dǎo)致狀態(tài)轉(zhuǎn)換多了兩次;

? ? ? ? 若是SIG_DFL(默認(rèn)處理方式)和SIG_IGN(忽略方式),以內(nèi)核態(tài)身份就可以處理,然后就可以直接返回到用戶代碼中系統(tǒng)調(diào)用的位置,少了兩次身份的轉(zhuǎn)變,如下圖:

Linux——進程信號的發(fā)送,Linux,linux,運維

????????默認(rèn)和忽略動作只有兩次的身份切換。這兩種方式是程序員寫入到操作系統(tǒng)中的宏定義,是被操作系統(tǒng)所信任的方式,那在第三步的過程中就直接在內(nèi)核態(tài)處理完畢,然后直接返回用戶態(tài)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-548150.html

到了這里,關(guān)于Linux——進程信號的發(fā)送的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux進程信號 | 信號處理

    Linux進程信號 | 信號處理

    前面的文章中我們講述了信號的產(chǎn)生與信號的保存這兩個知識點,在本文中我們將繼續(xù)講述與信號處理有關(guān)的信息。 之前我們說過在收到一個信號的時候,這個信號不是立即處理的,而是要得到的一定的時間。從信號的保存中我們可以知道如果一個信號之前被block,當(dāng)解除

    2024年02月09日
    瀏覽(26)
  • Linux進程信號【信號處理】

    Linux進程信號【信號處理】

    ?個人主頁: 北 海 ??所屬專欄: Linux學(xué)習(xí)之旅 ??操作環(huán)境: CentOS 7.6 阿里云遠程服務(wù)器 從信號產(chǎn)生到信號保存,中間經(jīng)歷了很多,當(dāng)操作系統(tǒng)準(zhǔn)備對信號進行處理時,還需要判斷時機是否 “合適”,在絕大多數(shù)情況下,只有在 “合適” 的時機才能處理信號,即調(diào)用信號

    2024年02月11日
    瀏覽(24)
  • Linux進程(一)信號-----信號產(chǎn)生

    Linux進程(一)信號-----信號產(chǎn)生

    在? Linux ?中,進程具有獨立性,進程在運行后可能 “放飛自我”,這是不利于管理的,于是需要一種約定俗成的方式來控制進程的運行,這就是? 進程信號 ,本文將會從什么是進程信號開篇,講述各種進程信號的產(chǎn)生方式及作用。 信號 是信息傳遞的承載方式,一種信號往

    2024年02月21日
    瀏覽(16)
  • 【Linux】進程信號之信號的產(chǎn)生

    【Linux】進程信號之信號的產(chǎn)生

    什么是信號: 信號就是一條消息,它用來通知進程系統(tǒng)中發(fā)生了一個某種類型的事件。 信號是多種多樣的,并且一個信號對應(yīng)一個事件,這樣才能知道收到一個信號后,到底是一個什么事件,應(yīng)該如何處理這個信號。 進程在沒有收到信號時就已經(jīng)知道了一個信號應(yīng)該怎么被處

    2024年02月13日
    瀏覽(17)
  • 【Linux】進程信號之信號的處理

    【Linux】進程信號之信號的處理

    在前面我們講過信號產(chǎn)生和保存以后,我們知道進程對于產(chǎn)生的信號不是立即去處理的,而是在\\\"合適\\\"的時候去處理信號, 這是因為信號的產(chǎn)生的異步的,當(dāng)前進程可能正在做更重要的事情!。 那么信號可以被立即處理嗎?答案的可以的,但是要滿足這個條件: 在 Linux 中如果

    2024年02月12日
    瀏覽(34)
  • 【Linux】進程信號之信號的保存

    【Linux】進程信號之信號的保存

    實際執(zhí)行信號的處理動作稱為 信號遞達(Delivery) 信號從產(chǎn)生到遞達之間的狀態(tài),稱為 信號未決(Pending) 。 進程可以選擇阻塞 (Block )某個信號。被阻塞的信號產(chǎn)生時將保持在未決狀態(tài),直到進程解除對此信號的阻塞,才執(zhí)行遞達的動作。 注意: 阻塞和忽略是不同的,只要信號被阻

    2024年02月13日
    瀏覽(26)
  • 【Linux】八、Linux進程信號詳解(一)

    【Linux】八、Linux進程信號詳解(一)

    「前言」文章是關(guān)于Linux進程信號方面的知識,本文的內(nèi)容是Linux進程信號第一講,講解會比較細(xì),下面開始! 「歸屬專欄」Linux系統(tǒng)編程 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) ?「楓葉先生有點文青病」「每篇一句」? 人生天地間,忽如遠行客。 ——《樂府·青青陵上

    2023年04月09日
    瀏覽(17)
  • Linux——信號發(fā)送代碼

    Linux——信號發(fā)送代碼

    一.信號集操作函數(shù) sigpromask函數(shù) ?代碼詳解: ?編輯 考慮情況一:對多個信號的屏蔽 考慮情況二:取消對信號的阻塞 運行結(jié)果:? 考慮情況三:若不想讓進程退出,采用自定義捕捉信號方式! 完整代碼: ????????sigset_t類型對于每種信號用一個bit表示“有效”或“無效

    2024年02月13日
    瀏覽(12)
  • 【Linux】進程信號 -- 信號保存與遞達 | 信號捕捉 | 僵尸進程的信號處理方法

    【Linux】進程信號 -- 信號保存與遞達 | 信號捕捉 | 僵尸進程的信號處理方法

    實際執(zhí)行信號的處理動作稱為信號遞達(Delivery) 信號從產(chǎn)生到遞達之間的狀態(tài),稱為信號未決(Pending)。 已經(jīng)收到但未處理的狀態(tài) 進程可以選擇阻塞 (Block )某個信號 被阻塞的信號產(chǎn)生時將保持在未決狀態(tài),直到進程解除對此信號的阻塞,才執(zhí)行遞達的動作 注意,阻塞和忽略是

    2024年02月16日
    瀏覽(50)
  • 【Linux之進程間通信】04.Linux進程間的信號通信

    ? 【Linux之進程間通信】 項目代碼獲?。?https://gitee.com/chenshao777/linux-processes.git (麻煩點個免費的Star哦,您的Star就是我的寫作動力!) 04.Linux進程間的信號通信 【目錄】 ??一、進程間信號發(fā)送方式 ??二、進程間信號接收方式 ??三、進程間信號處理方式 一、進程間信號發(fā)

    2024年02月06日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包