久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


你真的懂Linux線程和信號的關系嗎?


avatar
小浪云 2025-01-03 137

引言:

在討論信號時,我們通常更多地從進程的角度去理解,但當一個進程包含多個線程時,進程、線程、信號之間的關系會是怎樣呢?

1. 線程與信號的關聯

線程與信號的關系遵循以下幾個標準:

  • 標準1:同一線程組的線程共享信號處理函數。
  • 標準2:線程擁有獨立的信號阻塞集。
  • 標準3:存在私有未決信號隊列和共享未決信號隊列。
  • 標準4:當收到致命信號時,線程組將退出。

2.同一線程組線程之間共享信號處理函數(標準1)。

創建進程時,線程task_struct對象sighand成員會指向主線程指向的Struct sighand_struct對象,線程組所有線程共享主線程信號表。

原來的進程此時理解為主線程。

你真的懂Linux線程和信號的關系嗎?

**3.線程有獨立的阻塞信號集(*標準2*)。

每個線程task_struct都有各自的阻塞/屏蔽信號集(blocked成員)。

通過pthread_sigmask可以設置阻塞/屏蔽信號集,用來屏蔽特定的信號,

進程(主線程)可以由sigprocmask函數或者pThread_sigmask函數來設置阻塞/屏蔽信號集。

sigprocmask函數和pthread_sigmask底層實現方式一樣,沒有區別。

你真的懂Linux線程和信號的關系嗎?


pthread_sigmask函數原型

int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);

功能:pthread_sigmask函數用于設置線程阻塞信號集。

參數:

how:表示信號屏蔽字的修改方式。可以取以下三個值之一:

  • SIG_BLOCK:將set指定的信號添加到進程的當前信號屏蔽字中。
  • SIG_UNBLOCK:將set指定的信號從進程的當前信號屏蔽字中移除。
  • SIG_SETMASK:將當前信號屏蔽字設置為set指定的值。

set:指向需要修改的新信號屏蔽字集合的指針

oldset:指向保存之前信號屏蔽字的集合的指針

返回值:

成功:返回0。

失敗:返回-1,并設置errno

===========================================

文章沒看懂沒關系,每篇文章都有視頻講解:

圖解Linux環境編程視頻課程(完整版)正式發布了!!!

===========================================


**4.私有未決信號隊列和共享未決信號隊列(*標準3*)。

每個線程task_struct都有各自的未決信號隊列(pending成員)。

每個線程組主線程有一個共享未決信號隊列(signal成員),其他線程共享主線程共享未決信號隊列。

當主線程收到信號后,如果主線程設置了阻塞/屏蔽信號集,那么該信號會存儲在共享未決信號隊列,比如通過kill或者sigqueue函數發送給主線程的信號。

其他線程收到信號后,如果線程設置了阻塞/屏蔽信號集,那么該信號會存儲在私有未決信號隊列,比如通過tkill,tgkill,pthread_kill,以及pthread_sigqueue函數發送給線程的信號。

你真的懂Linux線程和信號的關系嗎?

共享未決信號隊列信號如何處理?

  • 主線程優先處理共享未決信號隊列信號。
  • 其他線程在主線程不方便處理時,才會處理共享未決信號隊列信號。

tkill函數原型

int tkill(int tid, int sig);

int tgkill(int tgid, int tid, int sig);

描述:

tkill函數用于發送信號到指定線程,tid表示線程ID,sig表示信號編號,不安全盡量少用。

tgkill函數用于向指定線程發送信號,tgid表示線程組ID,tid表示線程ID,sig表示信號編號。

返回值:

成功:返回0。

失敗:返回-1,并設置errno


pthread_kill函數原型

int pthread_kill(pthread_t thread, int sig);

功能:pthread_kill函數用于向指定線程發送信號的函數。

參數:

thread:為目標線程的標識。

sig:要發送的信號的編號。

返回值:

成功:返回0。

失敗:返回errno。


pthread_sigqueue函數原型

int pthread_sigqueue(pthread_t thread, int sig,

const union sigval value); 

功能:pthread_sigqueue函數是一個用于向指定線程發送信號及數據的函數。

pthread_sigqueue使用方法可以參考sigqueue函數。

參數:

thread:為目標線程的線程標識符

sig:為要發送的信號編號。

value:為發送給目標線程的附加數據。

返回值:

成功:返回0。

失敗:返回errno。


常用產生信號函數對比:

你真的懂Linux線程和信號的關系嗎?

5.收到致命信號,線程組退出(標準4)。

所謂致命信號就是能讓線程終止的信號,可查看信號默認處理方式表。

這一條標準的目的是為了實現同一線程組里線程的統一退出管理。

相關閱讀

主站蜘蛛池模板: 91欧美在线| 亚洲欧美精品中字久久99 | 国产性videostv另类极品 | 精品日韩二区三区精品视频 | 精品国产高清久久久久久小说 | 免费看欧美一级特黄a大片一 | 国产九九视频在线观看 | 九草在线播放 | 亚洲人成a在线网站 | 亚洲综合一区二区精品久久 | 国产年成美女网站视频免费看 | 日韩中文字幕在线亚洲一区 | 欧美中文字幕 | a级午夜毛片免费一区二区 a级性生活视频 | 亚洲美女性视频 | 日本三级香港三级三级人!妇久 | 亚洲成人高清在线 | 透逼视频 | 国产高清精品久久久久久久 | 欧美日韩亚洲成色二本道三区 | 国产一级久久久久久毛片 | 波多野一区二区三区在线 | 国产高清免费观看 | 97人摸人人澡人人人超一碰 | 国产大乳喷奶水在线看 | 美女视频免费看视频网站 | 国产成人啪一区二区 | 久久免费观看国产精品 | a毛片免费播放全部完整 | 亚洲第一大网站 | 久久久国产精品免费视频 | 国产男女视频在线观看 | 国产日韩欧美综合一区二区三区 | 欧美高清一区 | 亚洲精品免费在线观看 | 97精品久久久久中文字幕 | 精品久久看 | 亚洲系列中文字幕一区二区 | 精品国产区一区二区三区在线观看 | 久久精品免费观看国产软件 | 欧美aaaaa一级毛片在线 |