linux 多執行緒通訊(二)訊號的處理

2021-10-08 09:29:26 字數 2223 閱讀 4606

int pthread_kill(pthread_t thread, int sig);

傳送訊號

如果sig是0,則無訊號傳送,但可以用來檢測線程是否還活著。sigquit是終止。

返回值:

esrch 執行緒已結束

einval 執行緒還存在

void

sig_handler1

(int arg)

void

*thread_fun1

(void

*arg)

多執行緒訊號遮蔽處理。

int pthread_sigmask(int how,const sigset_t *set, sigset_t *oldset)

how=sig_block :向當前的訊號掩碼中新增set,其中set表示要阻塞的訊號組

sig_block 刪除set

sig-setmask 替換為set

例項

#include "stdio.h"

#include "pthread.h"

#include "stdlib.h"

#include "signal.h"

#include "string.h"

#include "unistd.h"

void

sig_handler1

(int arg)

void

sig_handler2

(int arg)

void

*thread_fun1

(void

*arg)

void

*thread_fun2

(void

*arg)

int main()

err =

pthread_create

(&tid2,

null

,thread_fun2,

null);

if(err!=0)

sleep(1

);s =

pthread_kill

(tid1 ,

sigquit);

if(s!=0)

s =pthread_kill

(tid2 ,

sigquit);

if(s!=0)

pthread_join

(tid1,

null);

pthread_join

(tid2,

null);

return0;

}

結果:可能會出現thread2 get signal 或thread1 get signal

因為sigaction的作用是最後一次定義的,有可能是handler1或handler2,所以main中傳送sigquit訊號時,有兩種情況發生。

這兩個函式要成對出現,否則編譯無法通過。

當執行以下操作時呼叫清理函式,清理函式的引數由arg傳入

#include "stdio.h"

#include "pthread.h"

#include "stdlib.h"

#include "signal.h"

#include "string.h"

#include "unistd.h"

void

*first_clean

(void

*arg)

//處理函式1

void

*second_clean

(void

*arg)

//處理函式2

Linux程序間通訊(二) 訊號機制

訊號方式 軟中斷訊號signal,簡稱訊號,用來通知程序發生了非同步時間。程序之間可以通過系統呼叫kill等函式來傳送軟中斷訊號,通知程序發生了某個事件,但訊號只能用來通知程序發生了什麼事件,並不給該程序傳遞任何資料。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達 訊號處理的三個過程 傳送...

多執行緒通訊 訊號量

當當前資源的數量大於0的時候,等待訊號量的執行緒可以獲得乙個資源並繼續執行,訊號量的當前資源數量將減1,如果當前資源的數量為0,則等待訊號量的執行緒將處於等待狀態,直到有執行緒釋放訊號量,使訊號量標識的資源數量大於0 handle createsemaphore lpsecurity attribu...

蘇嵌學習之程序通行二訊號通訊

訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式 訊號可以直接進行使用者空間程序 註冊和登出 這個登出不是很清楚 和核心程序 核心產生 之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。如果該程序當前並未處於執行態,則該訊號就由核心儲存起來,直到該程序恢復執行再傳遞...