IPC——線程訊號問題

來源:互聯網
上載者:User

標籤:獨立   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——線程訊號問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.