更新全局变量时屏蔽信号

时间:2011-10-02 03:24:40

标签: c signals masking signal-handling

我知道我可以屏蔽执行处理程序时引发的信号(通过使用sa_mask)。但是,我想知道在更新一些全局变量时如何屏蔽信号。

此外,我想知道在执行特定用户定义函数时如何屏蔽信号。

可以做这两件事吗?

任何帮助将不胜感激

由于

2 个答案:

答案 0 :(得分:0)

您可以随时调用“signal()”;要么a)将信号处理程序设置为某些自定义代码,要么b)通过将handler参数设置为NULL来清除它。

当然,

sigaction()可以为您提供更细粒度的控制。您可以随时调用sigaction(例如,在更新全局变量之前)。

此链接可能有所帮助:

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

答案 1 :(得分:0)

可以使用sigblock()阻止信号。当信号被解除阻塞时,阻塞的信号将排队并释放。

但是 - 这太贵了。你必须做一个系统调用来阻止和一个系统调用来解除阻塞。如果经常这样做,这可能会很慢。所以有一些替代方法:

  1. 如果您使用的是Linux,请使用signalfd。您可以阻止所有信号一次并将它们重定向到文件描述符,然后在安全的情况下处理它们。
  2. 否则(或者如果异步信号处理很重要),您可以推迟用户空间中的信号。在进入关键部分之前,请设置volatile标志。在信号处理程序中,检查此标志;如果您看到它,write()pipe信号编号并立即返回。在信号处理程序中,检查此管道上的信号,然后重新raise此时的信号。