歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 中關於信號的處理在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.   
  3.   //Save caller's signal mask before setting VM signal mask   
  4.   sigset_t caller_sigmask;  
  5.   pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);  
  6.   
  7.   OSThread* osthread = thread->osthread();  
  8.   osthread->set_caller_sigmask(caller_sigmask);  
  9.   
  10.   pthread_sigmask(SIG_UNBLOCK, os::Linux::unblocked_signals(), NULL);  
  11.   
  12.   if (!ReduceSignalUsage) {  
  13.     if (thread->is_VM_thread()) {  
  14.       // Only the VM thread handles BREAK_SIGNAL ...   
  15.       pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);  
  16.     } else {  
  17.       // ... all other threads block BREAK_SIGNAL   
  18.       pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);  
  19.     }  
  20.   }  
  21. }  
Copyright © Linux教程網 All Rights Reserved