开发者

Deferring signal handling in Linux

开发者 https://www.devze.com 2022-12-31 15:25 出处:网络
I\'m trying to figure out how to block a signal in Linux kernel 2.4 (user space) from invoking its handler, but keep it available to be handled later, preferably as soon as I re activate the handling

I'm trying to figure out how to block a signal in Linux kernel 2.4 (user space) from invoking its handler, but keep it available to be handled later, preferably as soon as I re activate the handling of said signal.

The function sigprocmask seem to come up in all my search results, but I can't find a good, clear description that explains whether the blocked signal gets "saved" to be handled later, and if so where and how do I handle it when I'm ready for it.

Can someone ple开发者_运维百科ase clarify what's going on, preferably with a code example? Thanks in advance.


I really can't say it better than the signal(7) man page:

A signal may be blocked, which means that it will not be delivered until it is later unblocked. Between the time when it is generated and when it is delivered a signal is said to be pending.

Each thread in a process has an independent signal mask, which indicates the set of signals that the thread is currently blocking. A thread can manipulate its signal mask using pthread_sigmask(3). In a traditional single-threaded application, sigprocmask(2) can be used to manipulate the signal mask.

So, you can block and unblock the signal with sigprocmask(). If the signal is raised while it's blocked, the handler won't be called until it's unblocked. If a signal is pending when it's unblocked, the handler for the signal will be called as usual.

Note that a given signal is either pending or not; it can't be "pending twice" (or more). if the signal is raised twice while it is blocked, it'll still only be delivered once.

0

精彩评论

暂无评论...
验证码 换一张
取 消