概覽
因malloc是加鎖的,上網了解的相關信息,額外了解到信號處理規范使用,mark
正文
在執行malloc的過程中,跳轉到了信號處理函數中。而信號處理函數在調用某個系統api時,內部又調用了malloc。 看了glibc源碼就會知道,malloc內部也是有鎖、而且是非嵌套的,如果在上一次調用中拿到鎖,又跳轉到信號處理函數中再次malloc,自然就導致死鎖了。而且即使沒有死鎖,也極有可能破壞malloc內部維護的一些全局信息,導致后面莫名其妙的崩潰;由此可見,對於信號處理函數“必須保證可重入”這一點,在實際編碼中必須慎之又慎,時刻謹記。
一般來說,信號處理函數中要做的事情應該盡量簡單。通常可以置一個標識,由其他線程檢測到這個標識后再做相應處理,而不是直接在信號處理函數中做這些事情。