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