Linux信號_總結 對信號本質的理解: 類似於中斷,區別在於中斷是由硬體產生的,而信號是由軟體實現的。 信號的來源: 觸發硬體(觸發鍵盤,或是硬體故障);軟體信號函數kill 、alarm、setitimer、sigqueue 等函數。 信號的分類: 可靠信號與不可靠信號,實時信號與非實時信號; ...
對信號本質的理解:
類似於中斷,區別在於中斷是由硬體產生的,而信號是由軟體實現的。
信號的來源:
觸發硬體(觸發鍵盤,或是硬體故障);軟體信號函數kill 、alarm、setitimer、sigqueue 等函數。
信號的分類:
可靠信號與不可靠信號,實時信號與非實時信號;
不可靠信號:
SIGRTMIN前的信號稱為不可靠信號,在早期這段信號可能做出錯誤的反應,或是丟失。因此對此段信號成為不可靠信號。
可靠信號:
在SIGRTMIN與SIGRTMAX之間的信號稱做可靠信號,可靠信號是為了防止信號丟失的。這些信號可以排隊處理。
實時信號與非實時信號:
非實時信號都不支持排隊,都是不可靠信號;實時信號都是支持排隊的,都是可靠信號;
對信號的響應:
響應的三種方式
(1)忽略信號
有兩個特殊的信號SIGKILL 和SIGSTOP信號不能被忽略。
(2)捕捉信號
給對應的信號綁定響應的處理函數,帶到信號產生時,執行對應的函數。
(3)執行預設信號
進程對實時信號的預設反應時進程的終止。
信號的發送:
發送信號的函數有,kill(), alarm(),raise(),setitimer();
(1)kill(int pid, int signal);
PID參數 | 信號的就收進程 |
---|---|
pid>0 | 進程的ID為pid的進程 |
pid=0 | 同一個進程組 |
pid<0 && pid!=-1 | 進程組ID為pid絕對值的所有進程 |
pid=-1 | 發送至所有ID大於1的進程 |
參數介紹:
pid為進程號,singnal為信號值。
kill常用於pid>0的信號處理,調用成功返回0,否則返回-1。
(2)alarm(unsigned int seconds)
專門為SIGALRM信號而設函數,seconds表示時間,此函數意味著在seconds秒後向SIGALRM信號發送消息。
進程調用alarm後,以前的alarm()調用都將無效。若調用alarm()前,進程中已經設置了鬧鐘,則返回上一個鬧鐘生於的時間,否則返回0;
eg:
(3)raise(int signal);
此函數時向本進程發送signal信號的,signal為即將發送的信號值。調用成功返回0;否則返回 -1。
(4)setitimer()函數
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
結構體介紹:
struct itimerval
{
struct timeval it_interval;//間隔時間
struct timeval it_value; //初始時間
};
struct timeval
{
long tv_sec; //秒
long tv_usec; //微妙
};
參數描述:
which:表示定時器類型,setitimer有三種定時器類型。
ITIMER_REAL : 以系統真實的時間來計算,它送出SIGALRM信號。
ITIMER_VIRTUAL : 設定程式執行時間;經過指定的時間後,內核將發送SIGVTALRM信號給本進程;
ITIMER_PROF : 設定進程執行以及內核因本進程而消耗的時間和,經過指定的時間後,內核將發送ITIMER_VIRTUAL信號給本進程;
it_interval指定間隔時間,it_value指定初始定時時間。如果只指定it_value,就是實現一次定時;如果同時指定 it_interval,則超時後,系統會重新初始化it_value為it_interval,實現重覆定時;
eg: