多线程下的信号和fork,以及IO操作

本文探讨了多线程环境下信号处理的问题,指出子线程在调用sigwait后能独占信号接收,避免中断其他线程。同时介绍了在多线程中进行IO操作,特别是pread和pwrite函数在并发访问同一文件时的重要作用。
摘要由CSDN通过智能技术生成
线程和信号
    信号十分复杂, 在本身进程基础上, 就存在信号处理. 信号屏蔽字. 信号未决等因素需要去考虑, 在遇到线程后, 信号与线程之间就更是复杂

基础认知

    每个线程都有自己的信号屏蔽字, 但是信号的处理是进程中所有线程共享的, 这就意味着单个线程可以阻止某些信号, 但当某个线程修改了与某个信号相关的处理行为后, 所有的线程都必须共享这个行为的改变.
    进程中的信号是递送到单个线程的。如果一个信号与硬件故障相关,那么该信号一般会被发送到引起该事件的线程去, 而其他的信号则会被发送到任意一个线程去.

线程信号操作
    是否还记得之前的sigpromask函数, 此函数只能用于单线程函数, 因为它会设置errno这个全局变量. 其实许多函数都是不允许在多线程情况下执行的, 他们都被称为不可重入函数. 大多数情况下,linux都提供了他们对应的可重入版本
    在线程中想要设置信号屏蔽字需要通过 pthread_sigmask
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
    用法与sigprocmask大致类似, 不需多言

    线程能通过sigwait来等待一个或多个信号的出现
int sigwait(const sigset_t *set, int *sig);
    set指定了线程等待的信号集, sig指向的整数表示接收到的信号值
    如果信号集中的某个信号在sigwait调用的时候处于挂起状态, 那么sigwait将会无阻塞的返回. 在返回前, sigwait将从进程中移除那些处于挂起等待状态的信号.
    为了避免错误行为的发生,线程在调用sigwait之前, 必须阻塞那些它正在等待的信号(即在调用sigwait之前将需要接收的信号阻塞),sigwait会在有要等待的信号被递送来之前,原子的取消信号的阻塞状态.接收到信号后,即在返回之前, sigwait还会恢复线程的信号屏蔽字
    为了防止信号中断某个线程的正常执行, 我们还可以把要接收的信号添加到每个线程的信号屏蔽字中,然后安排专用线程处理信号.

    进程之间的信号传递通过kill, 线程之间的信号传递也类似:
int pthread_kill(pthread_t thread, int sig);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值