从信号处理程序调用 SysV msgsnd

Calling SysV msgsnd from signal handler

从信号处理程序调用 msgsnd 函数安全吗?

我们服务的代码并不是为了每一个都优雅地完成,所以我没有退出点,但是我需要在服务停止时向另一个进程发送消息,所以我需要捕获 SIGTERM 并执行 msgsnd 在调用 exit(0) 之前。

这样安全吗?

我查看了 signal safety 手册页,但没有在列表中找到 msgsnd。我应该认为这是不安全的功能吗?可能的后果是什么?

不,这不安全。 (请注意 exit() 也没有出现在 the async-signal-safe function list 上,尽管 _exit() 出现了。)

msgsnd 可能无声地失败、可能出错、可能出现段错误、可能永远挂起等。

考虑一下重构 — 如果您需要在 SIGTERM 上做一些事情,那么我会说您 do 需要优雅的,或者至少不是笨拙的关闭逻辑。如果那不可行,也许 SEM_UNDO 可以做你想做的事,因为你似乎已经对 SysV IPC 感到满意了。或者持有在进程死亡时释放的文件系统锁。或者让服务父级捕获 SIGCHLD,然后调用 msgsnd。等等