我有一个 C 程序。我希望它在收到 SIGTERM 时始终能够干净地退出,退出代码为 0。我最早可以在哪里注册信号处理程序?我将它添加到了 main()
的顶部,但我担心它可能会在信号注册之前收到一个 sigterm。
是否可以更早地注册信号处理程序?
最佳答案
是的,你可以。使用特定于平台的初始化程序,例如 gcc 的 __attribute((constructor))
。但这并不是一个可靠的解决方案。
如果您希望“在收到 SIGTERM 时始终以退出代码 0 干净地退出”,则指示进程生成代码以 SIGTERM
blocked 开始.
然后,您的 main
可以注册信号处理程序并解锁 SIGTERM
(使用 sigprocmask
或 pthread_sigmask
,此时如果在进程创建到信号解除阻塞调用之间的任何时间点收到信号处理程序,则信号处理程序将立即运行。
本质上,它会将信号的传递推迟到您准备好处理它的时间点。
(请注意,如果您在信号被忽略而不是被阻止的情况下启动进程,那么在忽略该信号之前收到的任何信号实例都将丢失,就好像它们从未发生过一样。这似乎违背了您的规定要求。)
关于c - 最早什么时候可以注册信号处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66302790/