訊號 signal以及sigaction

2021-08-08 22:13:11 字數 2389 閱讀 2413

程式可以使用signal庫函式來處理訊號,定義如下:

#include 

void (*signal(int sig,void (*func)(int)))(int);

其中引數sig給出準備捕獲或者忽略的訊號,而接收到訊號後需要呼叫的函式則由引數func給出。

訊號處理函式也可以使用以下兩個特殊值

sig_ign     忽略訊號

sig_dfl 恢復預設行為

現在較多用的不是signal,而是sigaction。定義如下:

#include

int sigaction(int sig,const

struct sigaction *act ,struct sigaction *oact)

sigaction 的結構定義同樣在檔案signal.h 中 。他的作用是定義在接收到引數sig制定的訊號後應該採取的行動。

該結構至少應該包括以下幾個成員:

void (*)(int)sa_handler     /*function,sig_dfl or sig_ign

sigset_t sa_mask /*signals to block in sa_handler

int sa_flags /*signal action modifiers

sigaction 函式設定與訊號sig 關聯的動作。如果oact不是空指標,則sigaction將把原先對該訊號的動作寫道它指向的位置。如果act是空指標,則sigaction函式就不需要做其他設定,否則將在該引數中設定對指定訊號的動作。

與signal函式一樣,sigaction函式成功時返回0,失敗是返回-1,如果給出訊號無效或者對不允許捕獲或者忽略的訊號進行捕獲或者忽略,則會設定錯誤變數errno為einval。

在引數act只想的sigaction結構中,sa_handler為函式指標,類似於signal中的func,同樣可以設定為sig_ign 與sig_dfl。

sigaction的成員中,sa_mask制訂了乙個訊號集,這裡面儲存的是將會被遮蔽的訊號。

訊號集的型別名為sigset_t,以及一系列處理訊號集的函式:

#include int sigaddset(sigset_t *set,int signo);     /*新增給定的訊號

int sigemptyset(sigset_t *set); /*初始化訊號集為空

int sigfillset(sigset_t *set); /*初始化訊號集為所有以定義的訊號

int sigdelset(sigset_t *set,int signo); /*刪除給定的訊號

int sigismember(sigset_t *set ,int signo); /*判斷是否是訊號集成員

int sigprocmask(int how, const sigset_t *set ,sigset_t *oset);

最後那個sigprocmask函式比較複雜,它將根據how引數來修改程序的訊號遮蔽字,新的訊號遮蔽字由引數set(如果非空)給出,而原先的則會儲存到oset中。如果set為空,則此函式唯一目的為將現在的訊號遮蔽字儲存到oset中。

how的集中取值由下表給出:

sig_block   |   把引數set中的訊號新增到訊號遮蔽字中

sig_setmask | 把訊號遮蔽字設定為引數set中的訊號

sig_unblock | 從訊號遮蔽字中刪除引數set中的訊號

對於這裡的訊號遮蔽字作一點簡單說明:

這裡的訊號遮蔽就是指來了訊號,先不傳遞給當前程序,但是訊號仍然停留在待處理狀態,一旦unblock,則訊號會重新到達。

程式可以通過呼叫函式sigpending來檢視它阻塞的訊號中有哪些正停留在待處理的狀態。

int sigpending(sigset_t *set);
此函式將會把停留在待處理狀態的訊號寫道引數set指定的訊號集中。 如果程式需要處理訊號,又需要控制訊號處理函式的呼叫時間即可使用上這個函式。

sigaction中有乙個可以更好的實現pause函式的函式。

int sigsuspend (const sigset_t *sigmask);
此函式會將程序的遮蔽字替換為sigmask給出的訊號集,然後掛起程式的執行。當捕捉到乙個訊號後,首先執行訊號處理程式,然後從sigsuspend返回,最後將訊號遮蔽字恢復為呼叫sigsuspend之前的值。如果收到的訊號結束了程式,則suspend就不會返回,如果沒有終止程式,則會返回-1,並將errno設定為eintr。

Signal訊號處理

在goahead的linux模組main.c 檔案中,main函式中出現了以下三個語句 signal sigpipe,sig ign signal sigint,siginthandler signal sigterm,siginthandler 這三條語句與網路訊號有關。在這裡做咯記錄。1.訊號概...

signal 捕捉訊號

file demo6.c synopsis inclue typeof void sighandler t int sighandler t signal int signum,sighandler t handler author mrclimb version 1.1.0 date 2012 0...

signal訊號總結

signaldescription sigabrt 由呼叫abort函式產生,程序非正常退出 sigalrm 用alarm函式設定的timer超時或setitimer函式設定的interval timer超時 sigbus 某種特定的硬體異常,通常由記憶體訪問引起 sigcancel 由solari...