从信号处理程序调用{{1}}函数是否安全?
我们服务的代码不是为了每个优雅的完成,所以我没有退出点,但是我需要在服务停止时向另一个进程发送消息,所以我需要捕获SIGTERM并执行{{1}在调用exit(0)之前。
这样安全吗?
我查看了signal safety手册页,但未在列表中找到msgsnd
。我应该认为这是不安全的功能吗?有什么可能的后果?
答案 0 :(得分:1)
不,这不安全。 (请注意,exit()
也不会出现在the async-signal-safe function list上,尽管_exit()
会这样做。)
msgsnd
可能会默默地失败,可能会出错,可能会出现段错误,可能会永远挂起等等。
考虑重构一下 - 如果你需要在SIGTERM上做一些事情,那么我会说你做需要优雅,或者至少不是笨拙的关闭逻辑。如果这不可行,也许SEM_UNDO
可以做你想做的事,因为你似乎对SysV IPC感到满意。或者保持在进程死亡时释放的文件系统锁。或让服务父级捕获SIGCHLD,然后调用msgsnd
。等