歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 中關於信號的處理在Linux下的實現

Java 中關於信號的處理在Linux下的實現

日期:2017/3/1 10:40:29   编辑:Linux編程

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。

  1. void os::Linux::hotspot_sigmask(Thread* thread) {
  2. //Save caller's signal mask before setting VM signal mask
  3. sigset_t caller_sigmask;
  4. pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
  5. OSThread* osthread = thread->osthread();
  6. osthread->set_caller_sigmask(caller_sigmask);
  7. pthread_sigmask(SIG_UNBLOCK, os::Linux::unblocked_signals(), NULL);
  8. if (!ReduceSignalUsage) {
  9. if (thread->is_VM_thread()) {
  10. // Only the VM thread handles BREAK_SIGNAL ...
  11. pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
  12. } else {
  13. // ... all other threads block BREAK_SIGNAL
  14. pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
  15. }
  16. }
  17. }
Copyright © Linux教程網 All Rights Reserved