【发布时间】:2013-08-16 10:24:49
【问题描述】:
除非像sig_atomic_t 这样的原子类型,否则全局变量不会在信号处理程序中更新。鉴于以下 2 个条件,我可以在信号处理程序中安全地编辑全局变量吗?
- 如果我只定义一个信号处理程序
- 如果我使用
sa_mask或struct sigaction来阻止处理程序的所有信号 - 应用程序是单线程的
添加更多细节: 我有一个小的全局链表,其中保留了其子进程的一些信息。一旦我捕捉到 SIGCHLD (在父进程中),我想在我的信号处理程序中从链接列表中删除该节点。 我可以在具有上述条件并使用某种 pthread_mutex_trylock() 的信号处理程序中执行此操作吗?
【问题讨论】:
-
关于其他信号或任务抢占?
-
两者。我相信任务抢占不会发生,因为只有一个信号处理程序,并且在此处理程序完成之前,正常流程将不会恢复。请告知是否有其他任务抢占。
-
POSIX 信号没有排队,所以你不能假设你会可靠地为每个孩子获得一个单独的
SIGCHLD。 (如果两个子进程大致同时退出,则只生成一个信号。)这意味着您应该在信号处理程序中获取 所有 待处理的子进程,或者更好的是,只需设置一个 @ 987654325@ 标记到您的主线程,或者将信号量提升到工作线程以进行实际的收割。