Unix/Linux编程:以同步方式等待信号

sigwaitinfo和sigtimedwait是Linux系统调用,用于等待信号的到来。sigwaitinfo使进程挂起直至接收到set指定信号集中的信号,同时可以从信号队列中移除并返回信号信息。sigtimedwait增加了超时功能,允许设置等待信号的最长时间。这些调用比传统的信号处理器和sigsuspend组合更为高效且方便,尤其适用于需要精确控制信号处理的场景。
摘要由CSDN通过智能技术生成

sigwaitinfo

可以通过如何结合信号处理器和 sigsuspend()来挂起一个进程的执行,直至传来一个
信号。但是更方面的做法是可以利用 sigwaitinfo()系统调用来同步接收信号

SYNOPSIS
       #include <signal.h>

       int sigwaitinfo(const sigset_t *set, siginfo_t *info);

sigwaitinfo()系统挂起进程的执行,直到set指向信号集中的某一信号抵达。如果调用sigwaitinfo()时,set中的某一信号已经处于等待状态,那么sigwaitinfo()将立即返回。传递来的信号就此从进程的等待信号队列中移除,并且将信号编号返回作为函数结果。info参数如果不为null,则会指向经过初始化处理的 siginfo_t 结构,其中所含信息与提供给信号处理器函数的 siginfo_t 参数相同

sigwaitinfo()所接收信号的传递顺序和排队特性与信号处理器所捕获的信号相同,就是说,不对标准信号进行排队处理,对实时信号进行排队处理,并且对实时信号的传递遵循低编号优先的原则。

除了卸去编写信号处理器的负担之外,使用 sigwaitinfo()来等待信号也要比信号处理器外加sigsuspend()的组合要稍快一些

将对 set 中信号集的阻塞与调用 sigwaitinfo()结合起来,这当属明智之举。(即便某一信号
遭到阻塞,仍然可以使用 sigwaitinfo()来获取等待信号。)如果没有这么做,而信号在首次调用 sigwaitinfo()之前,或者两次连续调用 sigwaitinfo()之间到达,那么对信号的处理将只能依照其当前处置。

SUSv3 规定,调用 sigwaitinfo()而不阻塞 set 中的信号将导致不可预知的行为(其行为未定义

sigtimedwait

sigtimedwait()系统调用是 sigwaitinfo()调用的变体。唯一的区别是 sigtimedwait()允许指定
等待时限。

SYNOPSIS
       #include <signal.h>

       int sigtimedwait(const sigset_t *set, siginfo_t *info,
                        const struct timespec *timeout);

timeout 参数指定了允许 sigtimedwait()等待一个信号的最大时长,是指向如下类型结构的一枚指针:

struct timespec {
               long    tv_sec;         /* seconds */
               long    tv_nsec;        /* nanoseconds */
           }

填写 timespec 结构的所属字段,也就指定了允许 sigtimedwait()等待的最大秒数和纳秒数。如果将这两个字段均指定为 0,那么函数将立刻超时

如果将 timeout 参数指定为 NULL,那么 sigtimedwait()将完全等同于 sigwaitinfo()。SUSv3对于 timeout 的 NULL 值含义也语焉不详,而某些 UNIX 实现则将该值视为轮询请求并立即将其返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值