开发者

Masking signal when global variables are being updated

开发者 https://www.devze.com 2023-04-10 15:53 出处:网络
I am aware that i can mask a signal from being raised when handler is executing (by using sa_mask). However, i would like to know how to mask a signal when i am updating some global variables.

I am aware that i can mask a signal from being raised when handler is executing (by using sa_mask). However, i would like to know how to mask a signal when i am updating some global variables.

Also, i would like to know how to mask a signal when a particular user defined function is executing.

Is it possible to do these 2 things?

Any help will be appreciated

开发者_StackOverflow社区Thanks


You can call "signal()" any time you want; either to a) set the signal handler to some custom code, or b) clear it by setting the handler argument to NULL.

sigaction(), of course, gives you even finer-grained control. You can call sigaction whenever you wish (for example, before updating your global variables), too.

This link might help:

http://www.linuxjournal.com/article/6483


It's possible to block signals with sigblock(). Signals blocked will be queued and released when the signal is unblocked.

HOWEVER - this is super expensive. You have to do a syscall to block and a syscall to unblock. This can be quite slow if you do it often. So there are some alternative approaches:

  1. If you're on linux, use signalfd. You can block all signals once and redirect them to a file descriptor, then handle them whenever it's safe to do so.
  2. Otherwise (or if async signal handling is important), you can defer signals in userspace. Before entering your critical section, set a volatile flag. In your signal handler, check for this flag; if you see it, write() to a pipe the signal number and immediately return. In your signal handler, check back for a signal on this pipe, and re-raise the signal at that point.
0

精彩评论

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

关注公众号