日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 进程信号:信号的概念、生命周期、产生流程、阻塞

發(fā)布時間:2024/4/11 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 进程信号:信号的概念、生命周期、产生流程、阻塞 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 信號的概念
  • 信號的生命周期
  • 信號的阻塞

信號的概念

信號

信號是一個軟中斷。操作系統(tǒng)通過信號通知某個進程發(fā)生了某件事件,然后中斷這個進程當前操作,讓它優(yōu)先去處理這個事件。

我們在linux下常用的kill命令就是通過向進程發(fā)送一個信號來使進程中斷,我們可以通過kill -l來查看信號的種類

信號的種類


可以看到32和33號信號是不存在的,并且1-31是有具體名稱的,而34號及之后的都是以SIGTMIN+數(shù)字命名。

信號種類:62種

不可靠信號:1-31號,從unix借鑒而來,每個都有對于的系統(tǒng)事件,不可靠是因為可能會丟失信號導致事件丟失

可靠信號:34-64號,后期擴充的,因為沒有具體對應的事件,所以命名比較草率,不會丟失信號。


信號的生命周期

生命周期:產(chǎn)生信號->在進程中注冊信號->在進程中注銷進行->處理信號

信號的產(chǎn)生:

  • 通過終端按鍵產(chǎn)生信號
    例如常用的ctrl + z、ctrl + c、ctrl + \就是分別產(chǎn)生了SIGTSTP、SIGINT、SIGQUIT信號。
  • 通過調(diào)用系統(tǒng)函數(shù)向進程發(fā)送信號
    例如kill -x函數(shù),x就是對應的信號的序號,如果不知名則發(fā)送15號信號SIGTERM。kill殺死進程的原理就是通過發(fā)送一個信號,讓這個進程中斷并去處理這個信號,然而這個信號的處理結(jié)果就是讓這個進程退出。
    3.通過軟件異常產(chǎn)生信號
    例如上一篇說過管道如果讀端全部關閉,而寫端沒關閉時就會發(fā)送一個SIGPIPE的信號
    4.通過硬件異常產(chǎn)生信號
    例如當運算中以0為除數(shù),則CPU的運算單元會檢測到除0異常,并發(fā)送SIGFPE信號
  • 信號的注冊

    信號注冊的流程主要是修改pcb中的pending位圖并向pcb中的sigqueue鏈表中添加新的節(jié)點,但根據(jù)信號的種類不同操作也不同。

    不可靠信號的注冊:
    首先查看pending位圖該信號的標志位是否為0,如果為0則將標志位修改為1,并向sigqueue鏈表添加新的節(jié)點。如果為1則說明該信號已經(jīng)注冊過,則忽略此次事件,什么都不做,也正是因為這樣會導致事件的丟失,才被稱為不可靠信號。

    可靠信號的注冊:
    可靠信號注冊時則不管該信號是否注冊過,都會往sigqueue鏈表中添加新的節(jié)點并修改位圖,這樣就保證了每一個發(fā)送的事件都會被處理,這也是被稱為可靠的原因。

    信號的注銷

    為了保證每一種信號只被處理一次,所以需要先注銷再處理。
    注銷就是消除這個信號存在的痕跡,即修改位圖,刪除sigqueue中的節(jié)點。

    不可靠信號的注銷:
    因為不可靠信號只注冊了一次,只需要刪除sigqueue中的節(jié)點,然后所以將位圖對應的標志位置零。

    可靠信號的注銷:
    因為可靠信號注冊了多次,添加了多個節(jié)點,所以需要刪除該信號添加的所有相同節(jié)點,才將位圖對應的標志位置零。

    信號的處理

    因為信號是操作系統(tǒng)發(fā)給進程來通知某個事件的到來,所以對信號的處理也就是對事件的處理。

    信號的處理方式:
  • 默認處理方式: 就是操作系統(tǒng)為每一種信號準備的對應的處理方式

  • 忽略處理方式: 和名字一樣,忽略,什么都不做

  • 自定義處理方式: 我們可以自己寫一個回調(diào)函數(shù)來替換原來的處理方法,完成我們想要對這個信號的處理方式。


  • 信號的捕捉流程

  • 在主函數(shù)時因為異常或者中斷或者系統(tǒng)調(diào)用進入內(nèi)核態(tài)。
  • 處理完異常后開始處理信號
  • 調(diào)用用戶自定義的回調(diào)函數(shù),返回用戶態(tài)
  • 回調(diào)函數(shù)執(zhí)行完畢,通過系統(tǒng)調(diào)用sigreturn返回內(nèi)核態(tài)
  • 信號處理完畢,調(diào)用sys_sigreturn()返回到一開始主函數(shù)被中斷的地方,繼續(xù)執(zhí)行下面的語句。
  • 接口:

    sighandler_t signal(int signum, sighandler_t handler);信號typedef void (*sighandler_t)(int);//回調(diào)函數(shù),這是一個函數(shù)指針,我們通過編寫自己的回調(diào)函數(shù),然后signal通過函數(shù)指針來找到這個函數(shù),替換到原來的操作

    signum:信號的序號
    handler:處理方式
    頭文件:#include <signal.h>
    返回值:返回一個函數(shù)指針,也就是第二個參數(shù)


    信號的阻塞

    信號的阻塞并不是不注冊一個信號,而是注冊后暫時先不對它進行處理,在block位圖中修改標志位,將其阻塞,直到進程解除對該信號的阻塞的時候再處理這個信號

    同時,有兩個信號比較特殊,9號信號SIGKILL和19號信號SIGSTOP這兩個信號不可被阻塞,不可被忽略,不可被自定義處理

    接口:

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結(jié)

    以上是生活随笔為你收集整理的Linux 进程信号:信号的概念、生命周期、产生流程、阻塞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。