c - 最早什么时候可以注册信号处理程序?

标签 c process signals posix startup

我有一个 C 程序。我希望它在收到 SIGTERM 时始终能够干净地退出,退出代码为 0。我最早可以在哪里注册信号处理程序?我将它添加到了 main() 的顶部,但我担心它可能会在信号注册之前收到一个 sigterm。

是否可以更早地注册信号处理程序?

最佳答案

是的,你可以。使用特定于平台的初始化程序,例如 gcc 的 __attribute((constructor))。但这并不是一个可靠的解决方案。

如果您希望“在收到 SIGTERM 时始终以退出代码 0 干净地退出”,则指示进程生成代码以 SIGTERM blocked 开始.

然后,您的 main 可以注册信号处理程序并解锁 SIGTERM(使用 sigprocmaskpthread_sigmask,此时如果在进程创建到信号解除阻塞调用之间的任何时间点收到信号处理程序,则信号处理程序将立即运行。

本质上,它会将信号的传递推迟到您准备好处理它的时间点。

(请注意,如果您在信号被忽略而不是被阻止的情况下启动进程,那么在忽略该信号之前收到的任何信号实例都将丢失,就好像它们从未发生过一样。这似乎违背了您的规定要求。)

关于c - 最早什么时候可以注册信号处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66302790/

相关文章:

c - 更新函数中的结构数组并将其作为参数传递给其他函数

c - 使用指向c中指针变量的指针将二维数组传递给函数

linux - 一个多线程进程的线程ID可以和另一个正在运行的进程的进程ID相同吗?

创建 gtk 信号以编辑在其他线程中运行的 GtkWidget

c - 如何避免在命名管道关闭后阻塞 read()

c - 所有输入函数都使用相同的缓冲区吗?

不能捕获多个中断

C++ Windows/Linux 线程同步事件

C#处理标准输出延迟

c# - 单击按钮时如何检查已经打开的窗口?