【问题标题】:change atexit behavior based on program status根据程序状态更改 atexit 行为
【发布时间】:2018-03-30 20:03:26
【问题描述】:

我正在尝试使用atexit () 注册一个函数,该函数将根据程序的当前状态打印不同的消息。我知道当您使用atexit 注册函数时,您无法传递参数。

那么,如何传递程序状态,比如一个整数,并让该函数打印不同的语句?

我知道我可以注册多个函数,但我只能使用一个。

【问题讨论】:

  • 捂住鼻子使用全局变量?
  • 我早该想到的……谢谢!
  • 实际上,atexit() 的手册页提到了on_exit() 看看那个函数,它需要参数。
  • 这听起来是一个更好的选择。再次感谢
  • 如果 on_exit(我的文档称之为 _onexit)不是一个选项,你也可以考虑使用 libffi 创建一个闭包。基本上在运行时创建一个小函数,可以关联调用提供的参数之外的参数。

标签: c atexit


【解决方案1】:

不要使用atexit,而是使用on_exit 函数,它将传递给exit() 的状态作为一个参数,以及一个您可以传入的void *

int on_exit(void (*function)(int , void *), void *arg);

on_exit() 函数注册要调用的给定函数 正常进程终止,无论是通过 exit(3) 还是通过从 程序的 main()。该函数被传递给给定的状态参数 最后一次通话 到 exit(3) 和 on_exit() 的 arg 参数。

同一个函数可以注册多次:每次注册调用一次。 当通过 fork(2) 创建子进程时,它会继承其父进程的注册副本。在成功调用其中一个 exec(3) 函数,所有注册都被删除。

【讨论】:

  • 如果有的话,我当然会推荐on_exit。唯一的问题(如果有的话)是它的 glibc 扩展,因此可能并非无处不在。
【解决方案2】:

使用全局变量。这可以通过您在atexit 注册的函数读取。

【讨论】:

    【解决方案3】:

    这是一个不同的想法。除了使用全局变量或不同的 atexit 处理程序,您可以使用打印的 simplr 退出包装器 想要的消息,然后调用exit

    void my_exit(int rc)
    {
       /* Assuming you have enum constants ERR_1, etc,
        * with expected error codes and 0 isn't an error condition. */
    
       switch(rc) {
       case ERR_1:
           /* print message */
           break;
       case ERR_2:
           /* print message */
           break;
       ...
       }
    
       exit(rc);
    }
    

    您可以直接使用整数常量或使用 if-else 语句来代替 ERR_1 等。现在您可以将退出代码传递给my_exit,并在您使用exit() 的任何地方使用它。你也可以在main() 的末尾加上my_exit(0)

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 2019-11-30
      • 2017-03-03
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多