0

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

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

有可能做这2件事吗?

任何帮助将不胜感激

谢谢

4

2 回答 2

0

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

sigaction()当然,给你更细粒度的控制。您也可以随时调用 sigaction(例如,在更新全局变量之前)。

此链接可能会有所帮助:

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

于 2011-10-02T03:35:46.653 回答
0

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

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

  1. 如果您使用的是 linux,请使用signalfd您可以一次阻塞所有信号并将它们重定向到文件描述符,然后在安全的情况下处理它们。
  2. 否则(或者如果异步信号处理很重要),您可以延迟用户空间中的信号。在进入你的关键部分之前,设置一个volatile标志。在您的信号处理程序中,检查此标志;如果你看到它,write()给一个pipe信号号并立即返回。raise在您的信号处理程序中,检查此管道上的信号,并在该点重新发出信号。
于 2011-10-02T03:43:00.780 回答