linux應用執行緒和訊號處理

2021-06-23 00:35:08 字數 2513 閱讀 5512

執行緒和訊號處理

pthread庫也對執行緒和訊號的處理提供了一些函式,這些函式包括:

int pthread_sigmask(int how,const sigset_t * newmask, sigset_t * oldmask);

int pthread_kill(pthread_t thread,int signo);

int sigwait(const sigset_t * set, int * sig);

以上這些函式包含在signal.h中。

這三個函式如果正確執行,返回值都為0。如果發生錯誤,則pthread_sigmask()和pthread_kill()函式返回值不為0,並且相應的錯誤**被設定;sigwait()是執行緒取消點,總是返回0.

pthread_sigmask()

函式用來改變或者設定執行緒的訊號遮蔽(signal mask)。

newmask用來執行訊號遮蔽,設定訊號遮蔽之前的訊號遮蔽被存放到oldmask指向的位置。改變的方式由第乙個引數how決定。如果how是sig_setmask則把訊號遮蔽值設定為newmask;如果how是sig_block,那麼在newmask中指定的訊號就新增到了當前訊號的遮蔽中;如果how是sig_unblock,那麼newmask中指定的訊號從當前訊號遮蔽中被刪除。

pthread_sigkill()

函式可以向其它執行緒傳送訊號。

sigwait()

掛起呼叫sigwait()的執行緒,直到收到第乙個引數set指向的訊號集中指定的訊號,且等待到訊號被存放到第二個引數sig指向的位置。這裡需要注意的是,在多執行緒情況下,執行sigwait()的時侯,sigwait()的第乙個引數指向的訊號集中的訊號必須被阻塞。如果sigwait()等待的訊號有相應的訊號處理函式將不被呼叫。

在linux中,使用sigset_t資料型別存放訊號集合。對訊號集合的操作的gnu c library提供了一些函式:

int

sigemptyset(sigset_t

*set);

int

sigfillset(sigset_t

*set);

int

sigaddset(sigset_t

*set,

intsignum);

int

sigdelset(sigset_t

*set,

intsignum);

int

sigismember(sigset_t

*set,

intsignum);

以上這些函式包含在signal.h中

其中:

sigemptyset把set指向的訊號集清空。

sigfillset初始化訊號集讓其包括所有的訊號。

sigaddset把訊號signo新增到訊號集中。

sigdelset是從訊號集刪除訊號signo。

sigismember用來判斷某個訊號signo是否在訊號集中。

例子:下面給出的例子建立了兩個執行緒,執行緒thread2向執行緒thread1傳送訊號sigusr1和sigusr2。

執行緒thread2先向thread1傳送sigusr1訊號,然後再傳送sigusr2訊號。

執行緒thread1收到sigusr1訊號的時侯,執行緒thread1使用pthread_sigmask()對sigusr1進行阻塞,

故sigusr1訊號在解除sigusr1阻塞之前並沒有呼叫訊號處理函式sig_handler()處理訊號sigusr1,

此時sigusr1訊號變成未決訊號(pending signal),當執行緒thread1呼叫pthread_sigmask(sig_setmask,&oldmask,null)時,

恢復執行緒thread1原來的訊號遮蔽,這個時侯未決訊號sigusr1被處理。

執行緒thread1收到sigusr2時,並沒有呼叫訊號處理函式sig_handler(),

儘管sigusr1和sigusr2都是用signal()函式進行了註冊,但是執行緒thread1使用sigwait()等待sigusr2訊號。

#include #include #include using namespace std;

const int thread_number = 2;

pthread_t pt[thread_number];

void sighandler(int signo)

; sa_handler欄位包含乙個訊號捕捉函式的位址

sa_mask欄位說明了乙個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字復位為原先值。

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

sa_interrupt 由此訊號中斷的系統呼叫不會自動重啟

sa_restart 由此訊號中斷的系統呼叫會自動重啟

sa_siginfo 提供附加資訊,乙個指向siginfo結構的指標以及乙個指向程序上下文識別符號的指標

最後乙個引數是乙個替代的訊號處理程式,當設定sa_siginfo時才會用他。

Linux 多執行緒應用 訊號產生,訊號處理

筆者有一種應用場景,a 執行緒從 socket 接收指令,根據指令在 b 執行緒進行相應工作。採用訊號機制,設定 sigusr1 的訊號處理函式 sighandler,a 執行緒解析指令後發射訊號 sigusr1,b 執行緒執行sighandler.因對 posix 訊號機制不熟,過程中產生了一些誤...

Linux 執行緒和訊號

每個執行緒都有自己的訊號遮蔽字,但是訊號的處理是程序中所有執行緒共享的。這意味著單個執行緒可以阻止某個訊號,但是當某個執行緒修改了乙個訊號的處理行為,那麼所有執行緒都會共享這個改變。程序中的訊號是遞送到單個執行緒的。如果乙個訊號和硬體故障相關,那麼該訊號一般會被傳送到引起該事件的執行緒中去,而其他的...

Linux 訊號處理

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