线程和信号

本文介绍了多线程环境下信号处理的几个关键函数:pthread_sigmask允许屏蔽特定线程的信号响应,sigwait则用于串行处理信号队列中的信号,而pthread_kill则使一个线程能够向另一个线程发送信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个进程都有自己的信号屏蔽字,但是在一个线程中调用signal或者sigaction等函数会改变所以线程中的信号处理函数,而不是仅仅改变调用signal/sigaction的那个线程的信号处理函数。在POSIX标准中定义了一些用于进程信号处理的接口。

pthread_sigmask

#include <signal.h>
int pthread_sigmask(int how, const sigset_t *restrict set,
            sigset_t *retrict oset);

与sigprocmask相同,每个线程均有自己的信号屏蔽集(信号掩码),可以使用pthread_sigmask函数来屏蔽某个线程对某些信号的 响应处理,仅留下需要处理该信号的线程来处理指定的信号。

sigwait

#include <siganl.h>
int sigwait(const sigset_t *restrict set, int *restrict signop);

sigwait() 提供了一种等待信号的到来,以串行的方式从信号队列中取出信号进行处理的机制。sigwait()只等待函数参数中指定的信号集,即如果新产生的信号不在指定的信号集内,则 sigwait()继续等待。

这里注意:

  1. 对于非实时信号,相同信号不能在信号队列中排队;对于实时信号,相同信号可以在信号队列中排队。
  2. 如果信号队列中有多个实时以及非实时信号排队,实时信号并不会先于非实时信号被取出,信号数字小的会先被取出。

pthread_kill

#include <signal.h>
int pthread_kill(pthread_t thread, int signo);

在多线程程序中,一个线程可以使用pthread_kill对同一个进程中指定的线程(包括自己)发送信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值