Linux 執行緒和訊號

2021-08-16 07:21:25 字數 1725 閱讀 4779

每個執行緒都有自己的訊號遮蔽字,但是訊號的處理是程序中所有執行緒共享的。這意味著單個執行緒可以阻止某個訊號,但是當某個執行緒修改了乙個訊號的處理行為,那麼所有執行緒都會共享這個改變。

程序中的訊號是遞送到單個執行緒的。如果乙個訊號和硬體故障相關,那麼該訊號一般會被傳送到引起該事件的執行緒中去,而其他的訊號會被傳送到任意的執行緒中。

遮蔽字修改

#include 

int pthread_sigmask(int how, const sigset_t *restrict

set, sigset_t *restrict oset);

sigprocmask函式用來修改程序的訊號遮蔽字,但是它只能用在程序中,要修改執行緒的訊號遮蔽字應使用函式pthread_sigmask.

pthread_sigmask的介面和使用方式和sigprocmask相同,只不過失敗時返回值不像sigprocmask那樣放回-1並設定errno,而是返回錯誤編號。

傳送訊號

kill將訊號傳送給程序,而向執行緒傳送訊號則使用函式pthread_kill.

int pthread_kill(pthread_t thread, int signo);

可以傳乙個0值的signo來檢查執行緒是否存在。如果訊號的預設處理動作是終止該程序,那麼把訊號傳送給某個執行緒仍會殺死整個程序。

鬧鐘鬧鐘定時器是程序資源,所有執行緒共享相同的鬧鐘。所以,程序中的多個執行緒不可能互不干擾的使用鬧鐘定時器。

sigwait函式

#include 

int sigwait(const sigset_t *restrict

set, int *restrict signop);

如果在呼叫該函式時,訊號集set中的某個訊號處於掛起狀態,那麼函式會無阻塞地返回。返回前,sigwait將從程序中移除處於掛起狀態的訊號。若系統支援排隊訊號,則只移除該訊號,其他訊號繼續排隊。

為避免錯誤行為發生,執行緒在呼叫sigwait之前,必須阻塞要等待的訊號。sigwait函式會原子地取消訊號集的阻塞狀態,直到有新的訊號被傳遞。再返回前,sigwait會恢復執行緒的訊號遮蔽字。

使用sigwait的好處在於它可以簡化訊號處理,允許把非同步產生的訊號用同步的方式處理。為防止訊號中斷執行緒,可以把訊號加到每個執行緒的訊號遮蔽字中。然後可以安排專用線程處理訊號。這些執行緒可以進行函式呼叫,不需要擔心在訊號處理程式中呼叫哪些函式是安全地,因為這些函式呼叫來自正常的執行緒上下文,而非會中斷執行緒正常執行的傳統訊號處理程式。

下面是乙個使用專用線程處理訊號的例子,參考自《apue》12.8節。

#include 

#include

#include

#include

int quitflag;

sigset_t mask;

pthread_mutex_t lock = pthread_mutex_initializer;

pthread_cond_t waitloc = pthread_cond_initializer;

void *pth_fn(void *args)

}}int main()

執行示例

$ ./a.out

^cinterrupt

^cinterrupt

^\$

LINUX下多執行緒和訊號

說實話,訊號是我討厭的東西,在我些的 中,我都想用最簡單的辦法來處理它,現在遇到多執行緒中訊號的處理,apue中的說法也看得不是很懂,csdn中一位朋友有如下的總結,先記在這裡。1.預設情況下,訊號將由主程序接收處理,就算訊號處理函式是由子執行緒註冊的 2.每個執行緒均有自己的訊號遮蔽字,可以使用s...

linux應用執行緒和訊號處理

執行緒和訊號處理 pthread庫也對執行緒和訊號的處理提供了一些函式,這些函式包括 int pthread sigmask int how,const sigset t newmask,sigset t oldmask int pthread kill pthread t thread,int s...

執行緒和訊號

訊號屬於程序資源,多個執行緒共享訊號。執行緒內可以呼叫pthread sigmask 執行緒內可以呼叫signwait signset,opno 來專門處理訊號 當前程序阻塞的訊號集 專門的執行緒來處理訊號 signwait檢查signset,如果有未掛起或阻塞的訊號,那麼就返回並令這些訊號阻塞。為...