从信号处理程序调用 SysV msgsnd
Posted
技术标签:
【中文标题】从信号处理程序调用 SysV msgsnd【英文标题】:Calling SysV msgsnd from signal handler 【发布时间】:2018-01-17 15:11:19 【问题描述】:从信号处理程序调用msgsnd
函数是否安全?
我们的服务代码并不是为了每一个优雅地完成,所以我没有退出点,但是当服务停止时我需要向另一个进程发送消息,所以我需要捕获 SIGTERM 并在之前执行msgsnd
调用 exit(0)。
这样安全吗?
我查看了signal safety 手册页并没有在列表中找到msgsnd
。我应该认为这是不安全的功能吗?可能的后果是什么?
【问题讨论】:
【参考方案1】:不,这不安全。 (请注意,exit()
也不会出现在 the async-signal-safe function list 上,但 _exit()
会出现。)
msgsnd
可能会静默失败、可能会出错、可能会出现段错误、可能会永远挂起等等。
考虑重构一下——如果你需要在 SIGTERM 上做一些事情,那么我会说你确实需要优雅的,或者至少不是笨拙的关闭逻辑。如果这不可行,也许SEM_UNDO
可以做您想做的事,因为您似乎已经对 SysV IPC 感到满意。或者持有一个在进程死亡时释放的文件系统锁。或者让服务父级捕获 SIGCHLD,然后调用 msgsnd
。等等。
【讨论】:
这是备用计划,但这需要大量重构。 无论如何,这回答了我的问题。非常感谢!以上是关于从信号处理程序调用 SysV msgsnd的主要内容,如果未能解决你的问题,请参考以下文章
如何让我用 SysV 调用约定编译的 C 程序在 MinGW 下运行