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 是一个实时信号)。
最佳答案
在这里总结 Craig Estey 的回答(谢谢,伙计!):
在所有(最近的)手册页中 pthread_kill
被列为异步信号安全。 glibc 来源中有一条评论声称它在 fork()
存在的情况下不安全。 ,所以如果你觉得偏执,你可以使用 tgkill(getpid(), <thread-id>, <signal-id>)
.
所以,是的——两者都是 pthread_kill
和 tgkill
应该没问题。
在我的 CentOS 7 上 man
没有将其中任何一个列为安全的,但这可能是因为它太旧了。
关于c - pthread_kill 异步信号在 Linux 上安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485203/