基本概念
訊號的狀態
產生未決狀態 — 沒有被處理的
遞達 — 已經被處理的
訊號的優先順序比較高
程序收到訊號之後,暫停正在處理的工作
訊號集
kill----發射訊號給某個程序
raise ---- 自己給自己發訊號
函式原型 :int raise(int sig)
abort ---- 給自己傳送異常終止的訊號
alarm ----設定定時器(每個程序只有乙個定時器)
函式原型 unsigned int alarm(unsigned int seconds);
**setitimer **---- 定時器,並實現週期性定時
函式原型:
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
struct itimerval;
struct timeval;
//value的值是tv_sec+tv_suec,若不進行賦值操作就會預設乙個隨機數來初始化
未決訊號集與阻塞訊號集之間的關係:
訊號產生後處於未決狀態,訊號被放入未決訊號集等待處理,然後讀阻塞訊號集中該訊號對應的標誌位,當阻塞訊號集中該訊號對應的標誌位為0時,該訊號被處理,若為1,則不被處理。
用來遮蔽訊號、解除遮蔽也使用該函式。其本質,讀取或修改程序控制塊中的訊號遮蔽字。
** 嚴格注意,遮蔽訊號:只是將訊號處理延後執行(延至解除遮蔽);而忽略表示將訊號丟棄處理。**
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 成功:0;失敗:-1,設定errno
引數:set:傳入引數,是乙個自定義訊號集合。由引數how來指示如何修改當前訊號遮蔽字。
oldset:傳出引數,儲存舊的訊號遮蔽字。
how引數取值:假設當前的訊號遮蔽字為mask
sig_block: 當how設定為此值,set表示需要遮蔽的訊號。相當於 mask = mask|set
sig_unblock: 當how設定為此,set表示需要解除遮蔽的訊號。相當於 mask = mask & ~set
sig_setmask: 當how設定為此,set表示用於替代原始遮蔽及的新遮蔽集。相當於mask = set若,呼叫sigprocmask解除了對當前若干個訊號的阻塞,則在sigprocmask返回前,至少將其中乙個訊號遞達。
讀取當前程序的未決訊號集
int sigpending(sigset_t *set); set傳出引數。 返回值:成功:0;失敗:-1,設定errno
註冊乙個訊號捕捉函式:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); 成功:返回函式指標;失敗:返回sig_err,設定errno
該函式由ansi定義,由於歷史原因在不同版本的unix和不同版本的linux中可能有不同的行為。因此應該盡量避免使用它,取而代之使用sigaction函式。
修改訊號處理動作(通常在linux用其來註冊乙個訊號的捕捉函式)
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功:0;失敗:-1,設定errno
引數:act:傳入引數,新的處理方式。
oldact:傳出引數,舊的處理方式。
struct sigaction結構體
struct sigaction ;
sa_restorer:該元素是過時的,不應該使用,posix.1標準將不指定該元素。(棄用)
sa_sigaction:當sa_flags被指定為sa_siginfo標誌時,使用該訊號處理程式。(很少使用)
重點掌握:
① sa_handler:指定訊號捕捉後的處理函式名(即註冊函式)。也可賦值為sig_ign表忽略 或 sig_dfl表執行預設動作
② sa_mask: 呼叫訊號處理函式時,所要遮蔽的訊號集合(訊號遮蔽字)。注意:僅在處理函式被呼叫期間遮蔽生效,是臨時性設定,當處理函式執行完時,該訊號生效
③ sa_flags:通常設定為0,表使用預設屬性。
Linux系統程式設計 訊號
0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...
Linux系統程式設計 訊號
訊號的共性 1.簡單 2.不能攜帶大量資訊 3.滿足特定條件才能傳送 訊號的機制 1.訊號是軟體層面的中斷。一旦訊號產生,無論程式執行到什麼位置都必須結束 2.所有訊號的產生以及處理都是核心產生.訊號的產生 1.按鍵產生 程ctrl c ctrl v 2.系統呼叫產生 kill函式 3.定時器 al...
Linux系統程式設計 訊號
訊號處理雖然初學者用的不會很多,而且現有太多對訊號的替代品。但作為乙個打算專精發展的coder來說,還是必須學習和掌握的。linux下,乙個程序給其他程序傳送訊號的api是kill函式 include include intkill pid t pid,int sig sig 引數決定了要傳送的訊號...