根据程序状态更改退出行为
change atexit behavior based on program status
我正在尝试使用 atexit ()
注册一个函数,它将根据程序的当前状态打印不同的消息。我知道当你用 atexit
注册函数时你不能传递参数。
那么,如何传递程序状态,说一个整数,并使该函数打印不同的语句?
我知道我可以注册多个函数,但我只能使用一个。
使用全局变量。可以通过在 atexit
.
注册的函数读取
不使用 atexit
,而是使用 on_exit
函数,该函数将传递给 exit()
的状态作为一个参数,以及您可以传递的 void *
英寸
int on_exit(void (*function)(int , void *), void *arg);
The on_exit() function registers the given function to be called at
normal process termination, whether via exit(3) or via return from the
program's main(). The function is passed the status argument given to
the last call
to exit(3) and the arg argument from on_exit().
The same function may be registered multiple times: it is called once for each registration.
When a child process is created via fork(2), it inherits copies of its parent's registrations. Upon a successful call to one of the
exec(3) functions, all registrations are removed.
这是一个不同的想法。您可以使用一个简单的退出包装器来打印,而不是使用全局变量或不同的 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);
}
而不是 ERR_1 等,您可以直接使用整数常量或使用 if-else 语句。现在,您可以将退出代码传递给 my_exit
,并在您要使用 exit()
的任何地方使用它。您也可以使用 my_exit(0)
.
在 main()
的末尾调用它
我正在尝试使用 atexit ()
注册一个函数,它将根据程序的当前状态打印不同的消息。我知道当你用 atexit
注册函数时你不能传递参数。
那么,如何传递程序状态,说一个整数,并使该函数打印不同的语句?
我知道我可以注册多个函数,但我只能使用一个。
使用全局变量。可以通过在 atexit
.
不使用 atexit
,而是使用 on_exit
函数,该函数将传递给 exit()
的状态作为一个参数,以及您可以传递的 void *
英寸
int on_exit(void (*function)(int , void *), void *arg);
The on_exit() function registers the given function to be called at normal process termination, whether via exit(3) or via return from the program's main(). The function is passed the status argument given to the last call to exit(3) and the arg argument from on_exit().
The same function may be registered multiple times: it is called once for each registration. When a child process is created via fork(2), it inherits copies of its parent's registrations. Upon a successful call to one of the exec(3) functions, all registrations are removed.
这是一个不同的想法。您可以使用一个简单的退出包装器来打印,而不是使用全局变量或不同的 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);
}
而不是 ERR_1 等,您可以直接使用整数常量或使用 if-else 语句。现在,您可以将退出代码传递给 my_exit
,并在您要使用 exit()
的任何地方使用它。您也可以使用 my_exit(0)
.
main()
的末尾调用它