主線程在寫 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是不可重入函式,在訊號處理函式中呼叫不可重入函式會導致死鎖問題。
Go select 死鎖引發的思考
一文引發的延續思考 package main import fmt func main fmt.println the val ch func getval i int int無論 select 最終選擇了哪個 case,getval 都會按照原始碼順序執行 getval 1 和 getval 2 ...
syslog列印不帶等級 syslog日誌等級
設施.優先順序 facility.priority 設施 facility kern 0 核心日誌訊息 user 1 隨機的使用者日誌訊息 mail 2 郵件系統日誌訊息 daemon 3 系統守護程序日誌訊息 auth 4 安全管理日誌訊息 syslog 5 syslogd本身的日誌訊息 lpr ...
Go語言學習日誌之channel引發死鎖問題
今天在看到go中的channel時,就自己動手試了一下這個資料結構,先貼原始 package main import fmt time func main 乍一看沒毛病,但就是這麼簡單的乙個測試執行就直接報錯了 fatal error all goroutines are asleep deadlo...