linux訊號處理 和訊號相關的幾個系統呼叫

2021-06-26 03:41:41 字數 1472 閱讀 5595

一、sigaction函式

#include

int sigaction(int sig,const struct sigaction* act,strcut sigaction* oact);

sig引數指出要捕獲的訊號型別,act引數指定新的訊號處理方式,oact引數則輸出訊號先前的處理方式(如果不為null的話),act和oact都是sigaction結構體型別的指標

訊號集函式

#include

int sigemptyset(sigset_t* _set)

int sigfillset(sigset_t* _set)

int sigaddset(sigset_t* _set,int signo)

int sigdelset(sigset_t* _set,int signo)

int sigismember(const siggset_t* set,int signo)

程序訊號掩碼

指定程序的訊號掩碼,這樣這樣的訊號就不能傳送給本程序

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

how引數的型別

sig_bloc   新的程序掩碼是其當前值和_set指定訊號集的並集

sog_unblock 新的程序訊號掩碼是其當前值和~_set訊號集的交集,因此_set指定的訊號集將不被遮蔽

sig_setmask  直接將程序掩碼設定為_set

被掛起的訊號

設定程序訊號掩碼後,被遮蔽的訊號將不能被程序接受,如果給程序傳送乙個被遮蔽的訊號,則作業系統將該訊號設定為程序的乙個被掛起的訊號,如果我們取消對該訊號的遮蔽,則它能立即被程序接收到,如下函式可以獲得程序當前被掛起的訊號集

int sigpending(sigset_t* set);

程序即使多次接收到同乙個被掛起的訊號,sigpending函式也只能反映一次,並且當我們再次使用sigprocmask使能該掛起的訊號時,該訊號的處理函式也只被觸發一次。

幾個特殊的和網路程式設計有關的訊號:

sighup:

當掛起程序的控制終端時,sighup訊號被觸發,對於沒有控制終端的網路後台程式而言,他們通常利用sighup訊號來強**務器重讀配置檔案

sigpipe

預設情況下,往乙個讀端關閉的管道或socket連線中寫資料將引發sigpipe訊號,sigpipe預設欣慰是結束程序,需要修改這樣的預設行為。

我們也可以利用i/o復用系統呼叫來檢測管道和socket連線的讀端是否已經關閉。以poll為例子,當管道的讀端關閉時,寫端檔案描述符上的pollhup事件將被觸發,當socket連線被對方關閉時,socket上的pollrdhup事件將被觸發

sigurg

在linux環境下,核心通知應用程式帶外資料到達主要有兩種方法:一種是i/o復用技術,select等系統呼叫在接收到帶外資料時將返回,並向應用程式報告socke上的異常事件,另一種方法就是sigurg訊號

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...

Linux 訊號處理

用sigcation函式 在標頭檔案signal.h中 來設定自己的訊號處理函式,用法參見 各種訊號參見 寫了個sigint,也就是c c鍵的處理例子 include includestruct sigaction newsigint,oldsigint void signalinthandler ...

linux 訊號處理

linux下的程式,有時候需要在接到一些終止訊號後,進行清理工作再退出。訊號2的處理函式 void signalhandler 2 int signal cleanup exit 2 int main int argc,char argv 處理訊號2 struct sigaction act 2,a...