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