在Linux上pthread_kill异步信号安全吗?

时间:2018-07-23 18:33:17

标签: c linux signals

OpenGroup Unix规范claims pthread_kill()是异步信号安全的。但是Linux man 7 signal并未在相关部分中列出此功能。

那么,在Linux上的信号处理程序中调用pthread_kill是否安全?我知道它是使用tgkill()来实现的(这是安全的……但这也不会自动使pthread_kill()变得安全)。

一些背景:

  • 使用O_ASYNC/F_SETOWN_EX/F_SETSIG将SIGRTMIN信号定向到I / O准备就绪的特定线程...
  • 不幸的是,当实时信号队列已满时,Linux恢复为将SIGIO交付给整个过程...
  • 已安装此程序以纠正该SIGIO处理程序,该处理程序将该信号转发回指定线程(该线程阻塞SIGIO并在信号处理循环中使用sigwaitinfo()

编辑:信号处理线程将收到的SIGIO视为“我们有活动,但不知道在哪里-检查每个文件描述符”。不理想,但是比完全丢失信号要好。

编辑2:必须进行一些设计更新(出于某些不可思议的原因,我认为SIGIO是实时信号)。

1 个答案:

答案 0 :(得分:0)

在这里总结Craig Estey的答案(谢谢,伙计!)

在全部(最近)的手册页中def AddHostPortgroup(self,host, vswitchName, portgroupName): portgroup_spec = vim.host.PortGroup.Specification() portgroup_spec.vswitchName = vswitchName portgroup_spec.name = portgroupName network_policy = vim.host.NetworkPolicy() network_policy.security = vim.host.NetworkPolicy.SecurityPolicy() network_policy.security.allowPromiscuous = True network_policy.security.macChanges = False network_policy.security.forgedTransmits = False portgroup_spec.policy = network_policy host.configManager.networkSystem.AddPortGroup(portgroup_spec) 被列为异步信号安全的。 glibc来源中有一条评论说,在pthread_kill存在的情况下这是不安全的,因此,如果您感到偏执,可以使用fork()

是的,tgkill(getpid(), <thread-id>, <signal-id>)pthread_kill都应该没问题。

在我的CentOS 7上,tgkill并没有列出其中的任何一个是安全的,但这很可能是因为它太旧了。