gnu c on_exit - 分段错误

时间:2014-03-15 04:11:24

标签: c termination

出于好奇,我试图让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函数的正确设置是什么?为什么在这种情况下生成了分段错误?

1 个答案:

答案 0 :(得分:4)

代码行

  on_exit (exitfn (exit_status, somearg), somearg);

应该是

  on_exit (exitfn, somearg);

因为你不想在这个阶段调用exitfn(返回NULL!)