【问题标题】:Execute a function when a program exits normally or abnormally当程序正常退出或异常退出时执行一个函数
【发布时间】:2012-12-27 17:12:04
【问题描述】:

我想在 C 程序退出时执行管理功能。我知道atexit(),它可以帮助注册一个正常退出的函数,但不适用于像 SIGINT 或 SIGQUIT 这样的信号。我不想为默认行为是终止程序的所有此类信号注册信号处理程序。我只想注册一个函数,该函数将在程序终止之前执行,无论原因是什么。如何在 C 中做到这一点?

【问题讨论】:

  • 我认为没有选择。 A related question我发了,可能对你有帮助
  • 你正在使用哪个平台,如果是 window 那么 Hooks 可能在一定程度上有用。
  • 这个答案最后一段提到的方法怎么样:stackoverflow.com/a/12741496/694576
  • 内核模块不是一个好的解决方案——它们对内核版本的变化过于敏感,很多人,包括我自己,不会安装额外的内核模块,除非有一个非常好的理由为它。
  • 我也有这个问题。哇。这个相同的问题。如果这个问题有更好的答案就好了

标签: c unix signals exit


【解决方案1】:

您可以将您的 c 程序作为子进程运行吗? 您可以为此使用任何 exec 系列函数。

如果您的子进程正常或异常终止,那么有更好的选项可以从父进程中查询子进程的退出状态。

据此,您应该能够在父级中调用您的函数。

【讨论】:

  • +1 我也是...但是当然,这确实假设完成清理所需的信息不是被关闭的可执行文件的一部分。
【解决方案2】:

好吧,我不是 C/C++ 开发人员,但看看这个可能对您有所帮助的问题。 Shutdown Hook c++。虽然在 Java 中有一个非常好的方法,但在 C 中,我认为没有专门的函数来实现这一目的。

【讨论】:

    【解决方案3】:

    如果你已经知道你将收到什么类型的信号,你可以在 c 中编写一个信号处理程序。

    对于 Linux,请检查此答案:Ctrl + C interrupt event handling in Linux

    一些额外的参考: https://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html#:~:text=24%20Signal%20Handling,disconnection%20of%20a%20phone%20line.

    对于 Windows,请查看以下链接: C++: Continue execution after SIGINT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多