从信号处理程序调用msgsnd
函数是否安全?
我们的服务代码并不意味着每一个优美的完成,所以我没有退出点,但是当服务被停止时,我需要发送消息到另一个进程,所以我需要捕获SigTalk并在调用Exchange之前执行msgsnd
(0)。
那安全吗?
我查看了signal safety手册页,没有在列表中找到msgsnd
。我应该认为这是不安全的功能吗?可能的后果是什么?
最佳答案
不,这不安全。(注意exit()
也不会出现在the async-signal-safe function list上,尽管_exit()
会出现。)msgsnd
可能会悄无声息地失败,可能出错,可能出错,可能永远挂起,等等。
考虑一下重构——如果你需要在SIGTERM上做点什么,那么我会说你确实需要优雅的,或者至少不笨拙的关闭逻辑。如果这不可行,也许SEM_UNDO
可以做您想做的事情,因为您似乎已经习惯使用SysV IPC了。或者持有进程终止时释放的文件系统锁。或者让服务父级catch SIGCHLD,然后调用msgsnd
。等。