Linux信號SIGTERM、SIGKILL、SIGINT和SIGQUIT的區別;posix_kill使用


SIGTERM是不帶參數時kill發送的信號,意思是要進程終止運行,但執行與否還得看進程是否支持。但是SIGKILL信號不同,它可以被捕獲和解釋(或忽略)的過程。
SIGKILL是發送到處理的信號以使其立即終止。當發送到程序,SIGKILL使其立即終止。在對比SIGTERM和SIGINT,這個信號不能被捕獲或忽略,並且在接收過程中不能執行任何清理在接收到該信號。
SIGINT中斷信號,終端在用戶按下CTRL+C發送到前台進程。默認行為是終止進程,但它可以捕獲或忽略。
SIGQUIT是其控制終端發送到進程,當用戶請求的過程中執行核心轉儲的信號。 SIGQUIT通常可以ctrl+/。它可以被捕獲和解釋(或忽略)。

合適:

遇到信號量的問題?

 signal(SIGCLD,SIG_IGN)

SIGCHLD的語義為:子進程狀態改變后產生此信號,父進程需要調用一個wait函數以確定發生了什么。

 對於SIGCLD的早期處理方式如下:如果進程特地設置該信號的配置為SIG_IGN,則調用進程的子進程將不產生僵死進程。

 如果將SIGCLD的配置設置為捕捉,則內核立即檢查是否有子進程准備好被等待,如果是這樣,則調用SIGCLD處理程序。

APUE上SIGCLD語義寫的有點不清楚,到底我們的系統是如何來處理SIGCLD信號呢?
    1.SIG_DFL :默認的處理方式是不理會這個信號,但是也不會丟棄子進行狀態,所以如果不用wait,waitpid

對其子進行進行狀態信息回收,會產生僵屍進程。
    2.SIG_IGN :忽略的處理方式,這個方式和默認的忽略是不一樣的語意,暫且我們把忽略定義為SIG_IGN,
在這種方式下,子進程狀態信息會被丟棄,也就是自動回收了,所以不會產生僵屍進程,但是問題也就來了,
wait,waitpid卻無法捕捉到子進程狀態信息了,如果你隨后調用了wait,那么會阻塞到所有的子進程結束,並返
回錯誤ECHILD,也就是沒有子進程等待。
       APUE中P248敘述SIGCHLD如果配置成SIG_IGN也不會產生僵屍進程。是否系統SIG_IGN配置下,對
SIGCLD,SIGCHLD做出的處理方式是相同的。
   3.自定義處理方式:SIGCLD會立即檢查是否有子進程准好被等待,這便是SIGCLD最大漏洞了,一旦在信號
處理函數中加入了信號處理方式重建的步驟,那么每次設置SIGCLD處理方式時,都會去檢查是否有信號到來,
如果此時信號的確到來了,先是調用自定義信號處理函數,然后是調用信號處理方式重建函數,在重建配置的
時候,會去檢查信號是否到來,此時信號未被處理,會再次觸發自定義信號處理函數,一直循環。
    所以在處理SIGCLD時,應該先wait處理掉了信號信息后,再進行信號處理方式重建。
   SIGCHLD在配置信號處理方式時,是不會立即檢查是否有子進程准備好被扽帶,也不會在此時調用信號處理函數。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM