Linux 生产多线程程序中信号处理的最佳实践是什么?
What is best practice for signal handling in production multi-threaded program on Linux?
我正在编写一个多线程程序,它应该 运行 在 Linux 系统上。我想确定的是,如果程序处于可靠的 运行ning 条件下(即没有分段错误、没有中止等...),在退出时它会最终确定一个文件并写入一些尾随信息。为此,我想处理 termination signals 以触发正常关闭。
由于它是一个多线程程序,所有线程的所有信号都被屏蔽,但主线程除外,主线程在仅填充终止信号的信号集上调用 sigwait。所以所有其他信号都由它们的默认操作处理。
这是一个好的做法,还是我应该为每个信号提供自定义操作?
Is this a good practice,
绝对是。在多线程环境中以任何其他方式处理终止信号(通过没有一个线程负责它们)几乎是不可能的。
or I should provide a custom action for every signal?
没有。您通常希望处理 SIGINT、SIGTERM 和 SIGHUP。 SIGKILL 无法处理,我会单独留下 SIGQUIT,以便它可以用于核心转储应用程序。
使用signalfd()!
这使您可以在单个 select() 调用中处理信号以及文件描述符就绪情况。
我正在编写一个多线程程序,它应该 运行 在 Linux 系统上。我想确定的是,如果程序处于可靠的 运行ning 条件下(即没有分段错误、没有中止等...),在退出时它会最终确定一个文件并写入一些尾随信息。为此,我想处理 termination signals 以触发正常关闭。 由于它是一个多线程程序,所有线程的所有信号都被屏蔽,但主线程除外,主线程在仅填充终止信号的信号集上调用 sigwait。所以所有其他信号都由它们的默认操作处理。
这是一个好的做法,还是我应该为每个信号提供自定义操作?
Is this a good practice,
绝对是。在多线程环境中以任何其他方式处理终止信号(通过没有一个线程负责它们)几乎是不可能的。
or I should provide a custom action for every signal?
没有。您通常希望处理 SIGINT、SIGTERM 和 SIGHUP。 SIGKILL 无法处理,我会单独留下 SIGQUIT,以便它可以用于核心转储应用程序。
使用signalfd()!
这使您可以在单个 select() 调用中处理信号以及文件描述符就绪情况。