Linux pthread 執行緒 訊號

2022-08-30 01:33:12 字數 1604 閱讀 4294

執行緒的訊號

執行緒的訊號與程序之間的關係

執行緒沒有自己獨立的訊號機制。

執行緒的訊號依賴與所在的程序。

執行緒有自己的「訊號遮蔽集合」,使得:

1)各執行緒可以向其同程序內的執行緒傳送訊號。(使用pthread_kill

2)各執行緒可以設定幾的「訊號遮蔽集合」,其初值從建立執行緒中繼承。

訊號遮蔽集合類似與程序的訊號遮蔽字,

但它只作用於該執行緒。

使用pthread_sigmask(類似於程序的sigprocmask函式)

3)各執行緒共享對某訊號的處理方法,

即收到訊號後,各執行緒執行相同的處理函式。

除非該訊號被該執行緒遮蔽。

注意:程序收到能夠「終止」該程序的訊號後,該程序裡的所有執行緒都將終止。

向執行緒傳送訊號

pthread_kill

原型:int pthread_kill (pthread_t thread, int sig);

引數:sig, 如果為0,則檢測對應的執行緒thread是否存在

設定執行緒的訊號遮蔽集合

pthread_sigmask

原型: int pthread_sigmask(int how,

const sigset_t *restrict set,

sigset_t *restrict oset);

注意:用法和sigprocmask相似。

注意:sigkill和sigstop,對程序和執行緒都不能遮蔽。

#include 

#include

#include

#include

void sigusr_handle (int arg)

void * th1_handle(void *arg)

}void * th2_handle(void *arg)

}int main(void)

ret = pthread_create(&mythread2, null, th2_handle, null);

if (ret != 0)

sleep(3);

ret = pthread_kill(mythread1, sigusr1);

if (ret != 0)

ret = pthread_kill(mythread1, sigusr2);

if (ret != 0)

ret = pthread_kill(mythread2, sigusr1);

if (ret != 0)

sleep(1);

ret = pthread_kill(mythread2, sigusr2);

if (ret != 0)

ret = pthread_kill(mythread1, sigkill);

if (ret != 0)

pthread_join(mythread1, null);

pthread_join(mythread2, null);

printf("main thread end!\n");

return

0;

}

Linux pthread 執行緒的取消

執行緒的取消 即 執行緒的終止 某個執行緒,可以要求指定的執行緒終止!方法 1.傳送取消請求 pthread cancel 原型 int pthread cancel pthread t thread 注意 指定的執行緒接收到這個 請求 後,不一定馬上就終止。取決於 被取消執行緒 的 取消請求 的使...

linux pthread 基本使用

1.概述 該demo主要完成了linux下執行緒建立,以及資源 等操作,相關介面介紹可以參考 2.測試 執行緒程式設計demo 執行緒建立,以及資源 等 pthread並非linux系統的預設庫,而是posix執行緒庫 在linux中將其作為乙個庫來使用,因此加上 lpthread 或 pthrea...

pthread sigmask 控制線程的訊號掩碼

示例1 示例一 遮蔽訊號sigint 編譯 gcc pthread sigmask1.c lpthread 執行後,你發現你按下ctrl c 觸發sigint訊號 這個程式根本停不下來。因為sigint訊號已經如我們所願被遮蔽掉了。include include include include in...