標籤:獨立 tle 返回 item span 參考 str list mask
所有的線程共用相同的訊號處理方式
主線程將SIGINT訊號的處理方式設定為了捕獲,那麼所有的次線程共用這一處理方式,如果其中某個次線程改變了該訊號的處理方式,那麼所有的線程將共用這一改變。
回顧“訊號屏蔽字”和“未決訊號字”
作用
“訊號屏蔽字”和“未決訊號字”作用同進程訊號,參考IPC——訊號
修改訊號屏蔽字函數
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
沒有次線程時
此時整個進程只有一個主線程,整個進程的“訊號屏蔽字”和“未決訊號字”,就是主線程的“訊號屏蔽字”和“未決訊號字”。
有次線程時
每個次線程都有自己獨立的“訊號屏蔽字”和“未決訊號字”,次線程的“訊號屏蔽字”和“未決訊號字”是從主線程的“訊號屏蔽字”和“未決訊號字”複製而來的,在複製時,
(1)次線程的“訊號屏蔽字”會保留從主線程“訊號屏蔽字”所複製的值。
(2)次線程的“未決訊號字”會清空,也就是說不會保留所複製值。
如果次線程對某些訊號有特殊的“響應需求”的話,可以自己調用如下函數,修改次線程自己的“訊號屏蔽字”,以實現將某個訊號開啟或者屏蔽。
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
多線程時是如何響應訊號?
(1)進程收到訊號後,進程會找到某一個沒有屏蔽該訊號的線程去處理在這個訊號找哪一個線程,由進程說了算。
(2)如果所有的線程都屏蔽了該訊號的話,訊號發生時,進程會將未決訊號記錄到某個線程的“未決訊號字”中。同樣的,找哪一個線程,由進程說了算。
(3)當線程收到進程判給它的訊號後,而且如果該訊號的處理方式還是捕獲的話這個線程在運行時會被中斷,然後去執行訊號捕獲函數,當訊號捕獲函數執行完畢後,才會返回被中斷的線程,接著執行。
IPC——線程訊號問題