linux信號

信號是unix和linux系統響應某些條件而產生的一個事件。如果進程接收到信號,但事先沒有安排捕獲它,進程將會立刻終止。按照通常情況配置,在鍵盤上敲入中斷字符就會向前臺進程(即當前運行的進程)發送SIGINT信號,這將引起該進程的終止,除非它事先安排了捕獲這個信號。如果想發送一個信號給一個進程,且這個進程不是當前的前臺程序,就需要kill命令

int kill(pid_t pid, int sig)

鬧鐘函數

unsigned int alarm (unsigned int seconds)

該函數在seconds秒之後安排發送一個SIGALRM信號。

常用的信號接口爲signal和sigaction,sigaction相對比較健壯,推薦使用。以下是sigaction的一些信息。

sigaction函數的功能是檢查或修改與指定信號相關聯的處理動作(可同時兩種操作)。

他是POSIX的信號接口,而signal()是標準C的信號接口(如果程序必須在非POSIX系統上運行,那麼就應該使用這個接口)

給信號signum設置新的信號處理函數act, 同時保留該信號原有的信號處理函數oldact

int sigaction(int signo,const struct sigaction *restrict act,

              struct sigaction *restrict oact);

結構sigaction定義如下:

struct sigaction{
  void (*sa_handler)(int);
   sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler字段包含一個信號捕捉函數的地址

sa_mask字段說明了一個信號集,在調用該信號捕捉函數之前,這一信號集要加進進程的信號屏蔽字中。僅當從信號捕捉函數返回時再將進程的信號屏蔽字復位爲原先值。

sa_flag是一個選項,主要理解兩個

SA_INTERRUPT 由此信號中斷的系統調用不會自動重啓
SA_RESTART 由此信號中斷的系統調用會自動重啓

SA_SIGINFO 提供附加信息,一個指向siginfo結構的指針以及一個指向進程上下文標識符的指針

最後一個參數是一個替代的信號處理程序,當設置SA_SIGINFO時纔會用他。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章