多執行緒程式設計訊號處理順序

2021-07-05 23:29:11 字數 1835 閱讀 7339

執行緒可以使用sigwait來對訊號進行處理。

但是如果主線程中已經用sig_handler註冊了處理函式,子執行緒裡同時也用sigwait來處理訊號,那麼誰會先處理呢?apue上只是寫了一下依賴於作業系統,這裡我們來做實驗,看看linux中哪個會處理。

#include #include #include #include #include #include #include int quitflag;

sigset_t mask;

pthread_mutex_t lock = pthread_mutex_initializer;

pthread_cond_t wait = pthread_cond_initializer;

void * thr_fn(void * arg)

for(;;)

switch(signo)

}out0:

if(sigprocmask(sig_setmask, &oldmask, null) < 0)

#endif

exit(0);

}static void sigbus_handler(void* data)

static void qemu_init_sigbus(void)

int main(void)

exit(0);

}

編譯**

gcc test.c -o test -lpthread

執行結果

./test 

kill -7 $

sigbug: sigbus_handler 

kill -7 $

sigbug

從而可以看到,如果子執行緒中有寫了sigwait的處理函式,那麼sigwait處理,主線程是sig_handler處理

在做個試驗

#include #include #include #include #include #include #include int quitflag;

sigset_t mask;

pthread_mutex_t lock = pthread_mutex_initializer;

pthread_cond_t wait = pthread_cond_initializer;

void * thr_fn(void * arg)

exit(0);

}#if 1

static void sigbus_handler(void* data)

static void qemu_init_sigbus(void)

#endif

int main(void)

pthread_mutex_lock(&lock);

while(quitflag == 0)

pthread_mutex_unlock(&lock);

quitflag = 0;

exit(0);

}

執行結果

./test 

kill -7 $

sigbug: sigbus_handler 

kill -7 $

sigbug: sigbus_handler 

子執行緒中沒有響應的訊號處理函式,那麼系統會統一選用主程序中的訊號處理函sig_handler數進行處理

綜上所述

linux核心沒有做特殊處理的情況下:

如果子執行緒中有寫了sigwait的處理函式,那麼sigwait處理,主線程是sig_handler處理

子執行緒中沒有響應的訊號處理函式,那麼系統會統一選用主程序中的訊號處理函sig_handler數進行處理

mfc訊息處理順序

mfc中處理訊息的順序 1.afxwndproc 接收訊息,尋找訊息所屬的 cwnd 物件,然後呼叫 afxcallwndproc 2.afxcallwndproc 儲存訊息 訊息識別符號和訊息引數 供未來參考,然後呼叫 windowproc 3.windowproc 傳送訊息給 onwndmsg ...

網路 DNS處理順序

上文中我們知道了dns到底是個什麼樣的東西,現在我們來看下dns快取,為什麼會有dns快取呢?這是為了解決頻繁的訪問dns伺服器,直接在本地進行快取伺服器ip位址的策略,這樣我們輸入乙個 網域名稱譬如 www.baidu.com,就用再到dns伺服器去獲取對應的 的ip位址,直接從本地獲取ip位址去...

多執行緒下的訊號處理

參考apue 1.同乙個程序下的所有執行緒共享 訊號的處理方式,所以乙個執行緒改變對訊號的處理方式,那所有執行緒如果收到該訊號都會是那樣處理的 2.sigprocmask用於單執行緒的程序中阻止訊號傳送,但是在多執行緒的程序中並沒有定義 執行緒必須使用pthread sigmask.a.如果有的執行...