Linux系統程式設計 訊號

2021-09-22 22:31:31 字數 2384 閱讀 5660

基本概念

訊號的狀態

產生未決狀態 — 沒有被處理的

遞達 — 已經被處理的

訊號的優先順序比較高

程序收到訊號之後,暫停正在處理的工作

訊號集

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 引數決定了要傳送的訊號...