更新信号处理程序中的全局变量

时间:2013-08-14 12:49:04

标签: c linux signals handler

除非像sig_atomic_t这样的原子类型,否则全局变量不会在信号处理程序中更新。鉴于以下两个条件,我可以安全地编辑信号处理程序中的全局变量吗?

  1. 如果我只定义一个信号处理程序
  2. 如果我使用sa_mask struct sigaction来阻止处理程序的所有信号
  3. 应用程序是单线程的
  4. 添加更多详情: 我得到了一个小的全球链表,其中包含了其子进程的一些信息。一旦我抓住SIGCHLD(在父进程中),在我的信号处理程序中,我想从链表中删除该节点。 我是否可以在具有上述条件的信号处理程序中执行此操作并使用某种pthread_mutex_trylock()?

2 个答案:

答案 0 :(得分:0)

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

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

Signal handler won't see global variable

答案 1 :(得分:0)

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

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