Linux 的線程和信號
基於 NPTL 的線程庫,多線程應用中的每個線程有自己獨特的線程 ID,並共享同一個進程ID。應用程序可以通過調用 kill(getpid(),signo)
將信號發送到進程,如果進程中當前正在執行的線程沒有阻礙此信號,則會被中斷,線號處理函數會在此線程的上下文背景中執行。應用程序也可以通過調用 pthread_kill(pthread_t thread, int sig)
將信號發送給指定的線程,則線號處理函數會在此指定線程的上下文背景中執行。
java裡信號掩碼的集合
unblocked_sigs
SIGILL
SIGSEGV
SIGBUS
SIGFPE
SR_signum
SHUTDOWN1_SIGNAL(SIGHUP)
SHUTDOWN2_SIGNAL(SIGINT)
SHUTDOWN3_SIGNAL(SIGTERM)
vm_sigs
BREAK_SIGNAL (SIGQUIT)
allowdebug_blocked_sigs
SHUTDOWN1_SIGNAL(SIGHUP)
SHUTDOWN2_SIGNAL(SIGINT)
SHUTDOWN3_SIGNAL(SIGTERM)
SIG_BLOCK
NULL
在多線程的應用中,每個線程可以通過調用pthread_signmask()設置本線程的信號掩碼,可以設置阻塞的信號,但信號SIGKILL/SIGSTOP是不能被設置成阻塞的。
在java中,每個線程都設置了在表格中的信號掩碼,特別提到的是vm_sigs,這是只有一個quit 的信號結合,當沒有設置啟動參數 -Xrs (=ReduceSignalUsage)的時候,其他的線程設置成阻塞的,除了vm thread。