2011-10-02 67 views
0

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

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

可以做这两件事吗?

任何帮助将不胜感激

感谢

回答

0

你可以称之为 “信号()” 你想要的任何时间;或者a)将信号处理程序设置为某些自定义代码,或者b)通过将处理程序参数设置为NULL来清除它。

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

此链接可能帮助:

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

+0

如何在执行用户定义函数期间阻塞信号? – CuriousCoder

0

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

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

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