3

全局变量不会在信号处理程序中更新,除非是像sig_atomic_t. 鉴于以下 2 个条件,我可以在信号处理程序中安全地编辑全局变量吗?

  1. 如果我只定义一个信号处理程序
  2. 如果我使用sa_maskofstruct sigaction来阻止处理程序的所有信号
  3. 应用程序是单线程的

添加更多细节:我有一个小的全局链接列表,其中保存了其子进程的一些信息。一旦我捕获 SIGCHLD(在父进程中),我想在我的信号处理程序中从链接列表中删除该节点。我可以在具有上述条件并使用某种 pthread_mutex_trylock() 的信号处理程序中执行此操作吗?

4

2 回答 2

0

类型sig_atomic_t肯定会更新。您不能依赖任何其他类型在信号处理程序的上下文之外进行更新。它可能是,并且绝对不能保证它不会被更新。然而,这归结为缓存和多处理器的处理、异步执行和其他类似的事情。如果编译器认为一个变量不会改变,它可能会将它加载到一个寄存器中并且永远不会重新加载它。这是不允许的sig_atomic_t,所以它“不会出错”。

这类似于“在不同线程中更新全局变量”,更新需要在锁下或使用特殊的原子类型来完成。您不能在信号处理程序中使用锁,因为当持有一些锁时可以调用信号处理程序!

于 2013-08-14T13:01:35.127 回答
0

信号处理程序在访问静态数据结构时遇到问题。由此,您可以获得损坏的数据等。如果您尝试在信号处理程序中调用 printf(),很多时候您会得到奇怪的输出。

除非您使用原子类型,否则全局变量也是如此。

信号处理程序不会看到全局变量

于 2013-08-14T12:56:07.983 回答