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

标签 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 是一个实时信号)。

最佳答案

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

在所有(最近的)手册页中 pthread_kill被列为异步信号安全。 glibc 来源中有一条评论声称它在 fork() 存在的情况下不安全。 ,所以如果你觉得偏执,你可以使用 tgkill(getpid(), <thread-id>, <signal-id>) .

所以,是的——两者都是 pthread_killtgkill应该没问题。

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

关于c - pthread_kill 异步信号在 Linux 上安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485203/

相关文章:

c++ - DBus Glib,发送带有嵌套结构的信号

c++ - 停止 p‌r‌o‌b‌l‌e‌m 是否意味着程序无法检查其他程序?

c - 将BMP图像放入2D数组并在C中编辑RGB值

python - Raspbian 在桌面加载 Python 脚本后从终端窗口运行 4 个命令?

c++ - 如何知道当前正在移动哪个 QGraphicsItem?

linux - 如何发送USR2信号?

c - 递归函数崩溃

c++ - 是否可以触发由 1 发送触发的 2 接收回调?

c++ - 使用鼠标进行非鼠标输入

python - IDLE 中的 ImportError