[英]signal handler and library worker threads
我的應用程序的客戶端代碼是單線程的,但是我使用的是TCP套接字通信庫,該庫可能創建從客戶端應用程序角度來看應該透明的工作線程。 但是,我有一個捕獲SIGSEGV錯誤的信號處理程序,該錯誤處理程序試圖打印堆棧跟蹤,現在間歇性地失敗了。
我想知道是否可能在進程內部創建工作線程這一事實是否會影響信號處理程序的執行? 內核可以決定在某些工作線程中執行信號處理程序嗎? 如果是這樣,是否有某種方法可以避免這種情況的發生並強制信號處理程序始終在主進程線程上執行?
SIGSEGV
處理程序存在一個固有的問題,即每個SEGV
(不包括人為的示例)都是由未定義的行為(更不用說意外的行為)引起的,程序隨后所做的工作也同樣未定義。 或者用較少的語言律師用語,您不知道發生了什么。 例如,如果您覆蓋了堆,或者在保留malloc()
內的某些鎖的情況下執行SEGV
,則信號處理程序將無法正常工作。
在最好的情況下,讓線程和信號處理程序協同工作並非易事。 程序在線程化時對信號設置錯誤的容忍度要差得多(以我的經驗)。 首先,請確保您使用的是現代API。 IE不使用signal (2)
。 適當使用sigaction
和pthread_sigmask
。
請注意,某些信號(包括SIGSEGV
)被傳遞到進程而不是線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.