从信号处理程序调用 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信号量时不一致

如何让我用 SysV 调用约定编译的 C 程序在 MinGW 下运行

msgsnd的一个小问题

带有 SysV 共享内存的异步 MPI

如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序?

正确删除多个进程使用的 SYS V 信号量