• 常用
  • 百度
  • google
  • 站内搜索

手机教程

你真的懂Linux线程和信号的关系吗?

  • 更新日期:2025-07-06
  • 查看次数:5884

引言:

在讨论信号时,我们通常更多地从进程的角度去理解,但当一个进程包含多个线程时,进程、线程、信号之间的关系会是怎样呢?

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);

登录后复制

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken