一、很多事物或者是說很多系統的設計都是從生活中啓發的,信號在生活中常見的是“信號彈”和“摔杯爲號”,而我們可以從中總結出來信號有三個主要特性:①簡單 ②不能攜帶大量數據 ③滿足某個特定條件才發送 。
二、Linux中信號執行的機制:進程A給進程B發送信號,進程B收到信號前執行自己的相應指令;收到信號後,不管進程B執行到什麼位置,都必須要暫停執行;去處理信號,當信號處理完後再回去執行原來的指令。從信號執行機制拓展到幾個概念:
1、異步執行模式:類似上面描述,打斷原來的程序執行,先處理中斷,再回到執行原來程序。
2、硬件中斷:時鐘中斷,通過硬件來實現。
3、軟件中斷:信號就是軟件中斷。但是呢,對於CPU來說,軟件中斷是有較大延時性的;不過對於用戶來說不可察覺。
每個進程收到的所有信號,都是由內核負責發送,內核處理的!
三、與信號相關的事件和狀態
1、信號產生的方式(5種)
①按鍵產生:如 Ctrl+c、Ctrl+z 、Ctrl+\
②系統調用產生:如 kill、raise、abort
③軟件產生:如 定時器alarm、setitimer
④硬件異常產生:如 非法內存訪問(段錯誤) 、除0錯誤(浮點數例外)、內存對齊出錯(總線錯誤)
⑤命令產生:如 kill命令
2、信號的狀態(3種)
①產生:信號產生
②遞達:遞送併到達進程
③未決:在產生和遞達之間的狀態,信號產生了,而在遞送過程中被阻塞(屏蔽),就會變成未決信號。
3、信號的處理方式(3種)
①執行默認動作(每個信號都有默認執行動作)
②忽略(丟棄)
③捕捉(調用處理函數)
四、信號屏蔽字(阻塞信號集)和未決信號集
Linux內核的進程控制塊PCB是一個結構體(task_struct),除了包含進程ID、狀態、工作目錄、用戶ID、組ID、文件描述符表;還包含了信號相關的信息,主要是阻塞信號集和未決信號集。
阻塞信號集(信號屏蔽字):將某些信號加入該集合,對這些信號設置屏蔽;當屏蔽了11號信號,再收到11號信號,這個信號的處理將被延遲到解除屏蔽後。
未決信號集:
①信號產生,未決信號集中描述該信號的位立即置爲1,表示信號處於未決的狀態。當信號被處理了,該位又被置爲0。
②信號產生後由於某些原因不能遞達(主要由於阻塞),這類信號的集合被稱爲未決信號集;在屏蔽解除前,信號會一直處於未決狀態。
信號屏蔽字和未決信號及可以看成是一個存儲bool值的數組,數組中的值爲1,即設置了阻塞或者信號處於未決狀態。信號屏蔽字直接影響未決信號集!