閱讀464 返回首頁    go 阿裏雲 go 技術社區[雲棲]


syslog 引發死鎖

主線程在寫 syslog,同時在信號處理函數中也在寫syslog,當主線程在寫的時候,如果同時觸發了信號,那麼將會導致死鎖。
$pstack 4289
#0 0x00000036768df9ee in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000367688d0dd in _L_lock_1685 () from /lib64/libc.so.6
#2 0x000000367688ce27 in __tz_convert () from /lib64/libc.so.6
#3 0x00000036768cff7d in __vsyslog_chk () from /lib64/libc.so.6
#4 0x00000036768d0580 in syslog () from /lib64/libc.so.6
#5 0x00000000004c8c81 in SigChldHandler ()
#6
#7 0x000000367688d2ad in __tzfile_compute () from /lib64/libc.so.6
#8 0x000000367688ce5f in __tz_convert () from /lib64/libc.so.6
#9 0x00000036768cff7d in __vsyslog_chk () from /lib64/libc.so.6
#10 0x00000036768d0580 in syslog () from /lib64/libc.so.6

#11 0x00000000004c5c21 in HandleNewBinRequest ()


根本原因是syslog內部會調用malloc,而malloc是不可重入函數,在信號處理函數中調用不可重入函數會導致死鎖問題。


最後更新:2017-04-03 16:48:56

  上一篇:go “你不適合做程序員”
  下一篇:go Clojure命名空間中use與require的區別