1.信號(hào)的概念,信號(hào)是進(jìn)程收到某些事件發(fā)生的通知機(jī)制,也被稱為軟中斷。
信號(hào)的產(chǎn)生:信號(hào)一般有kernel產(chǎn)生,也可以由進(jìn)程通過一些系統(tǒng)調(diào)用產(chǎn)生,如kill,abort,alrm,raise等。
信號(hào)的投遞(delivery): kernel會(huì)將產(chǎn)生的信號(hào)盡快投遞給相應(yīng)進(jìn)程(進(jìn)程運(yùn)行時(shí)或下一次被調(diào)度時(shí)),是異步過程,在產(chǎn)生之后,投遞到進(jìn)程之前的這段時(shí)間處于未決狀態(tài)(pending)。
信號(hào)的阻塞(block):進(jìn)程可以阻塞一些信號(hào)的投遞,以防中斷代碼的執(zhí)行,每個(gè)進(jìn)程/線程有各自的阻塞信號(hào)掩碼。阻塞狀態(tài)中產(chǎn)生的相應(yīng)信號(hào)處于未決狀態(tài)(pending),直到進(jìn)程解除阻塞時(shí)才被投遞,相關(guān)調(diào)用如sigprocmask,pthread_sigmask , sigpending 。
信號(hào)的忽略(ignore):信號(hào)投遞到進(jìn)程后,調(diào)用相應(yīng)信號(hào)處理程序,分為三種處理情況:默認(rèn):系統(tǒng)默認(rèn)處理,忽略:不處理,自定義:調(diào)用自定義handler 。相關(guān)調(diào)用如signal,sigaction 。
2.信號(hào)分為實(shí)時(shí)信號(hào)和非實(shí)時(shí)信號(hào),老的unix信號(hào)都是非實(shí)時(shí)信號(hào),不排隊(duì)(同時(shí)觸發(fā)多個(gè)相同信號(hào)只有1次通知)。 新的SIGRTMIN~SIGRTMAX的信號(hào)是實(shí)時(shí)信號(hào),排隊(duì)。
3.帶參數(shù)的信號(hào)處理
在使用sigaction注冊(cè)信號(hào)時(shí),如果指定了SA_SIGINFO,則系統(tǒng)回調(diào)void (*sa_sigaction)(int, siginfo_t *, void *)進(jìn)行信號(hào)處理,siginfo_t會(huì)被傳送給處理函數(shù),可以在其中的si_value中指定傳遞的數(shù)據(jù)。
在發(fā)送信號(hào)時(shí)使用sigqueue,可以指定sigval,其中包含了需要傳遞的數(shù)據(jù)。
4.信號(hào)處理函數(shù)是不可重入的,所以一般只會(huì)在函數(shù)中設(shè)置一些flag,有用戶程序異步處理,比如退出信號(hào)TERM的處理。