从信号处理程序

时间:2018-01-17 15:11:20

标签: linux signals ipc

从信号处理程序调用{​​{1}}函数是否安全?

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

这样安全吗?

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

1 个答案:

答案 0 :(得分:1)

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

msgsnd可能会默默地失败,可能会出错,可能会出现段错误,可能会永远挂起等等。

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