出于好奇,我试图让libc on_exit函数起作用,但我遇到了分段错误的问题。我遇到的困难是找到正确使用此功能的解释。该函数在glibc中定义为:
Function:int on_exit(void(* function)(int status,void * arg),void * arg) 这个函数是atexit的一个更强大的变种。它接受两个参数,一个函数和一个任意指针arg。在正常程序终止时,使用两个参数调用该函数:传递给exit的状态值和arg。
我创建了一个小测试,但我无法找到生成分段错误的位置:
#include <stdio.h>
#include <stdlib.h>
void *
exitfn (int stat, void *arg) {
printf ("exitfn has been run with status %d and *arg %s\n", stat, (char *)arg);
return NULL;
}
int
main (void)
{
static char *somearg="exit_argument";
int exit_status = 1;
on_exit (exitfn (exit_status, somearg), somearg);
exit (EXIT_SUCCESS);
}
编译:gcc -Wall -o fn_on_exit fnc-on_exit.c
结果是:
$ ./fn_on_exit exitfn has been run with status 1 and *arg exit_argument Segmentation fault
不可否认,这对于经验丰富的程序员来说可能很明显,但我没有看到它。使用on_exit函数的正确设置是什么?为什么在这种情况下生成了分段错误?
答案 0 :(得分:4)
代码行
on_exit (exitfn (exit_status, somearg), somearg);
应该是
on_exit (exitfn, somearg);
因为你不想在这个阶段调用exitfn
(返回NULL!)