執行緒可以使用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.如果有的執行...