根据程序状态更改atexit行为

时间:2018-03-30 20:03:27

标签: c atexit

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

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

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

3 个答案:

答案 0 :(得分:2)

使用全局变量。您可以使用atexit注册的功能阅读。

答案 1 :(得分:2)

不使用atexit,而是使用on_exit函数将传递给exit()的状态作为一个参数,并使用void *来传递。{1}}。

  

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

     

on_exit()函数注册要调用的给定函数   正常的过程终止,无论是通过退出(3)还是通过返回   程序的主要()。该函数被传递给给定的status参数   最后一个电话          从on_exit()退出(3)和arg参数。

     

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

答案 2 :(得分:1)

这是一个不同的想法。您可以使用更简单的打印输出包装,而不是使用全局变量或不同的atexit处理程序 所需的消息然后调用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)结束时调用它。