gnu c on_出口-分段故障

gnu c on_出口-分段故障,c,termination,C,Termination,出于好奇,我正试图让libc on_exit函数工作,但我遇到了一个分段错误的问题。我遇到的困难是找到正确使用此函数的解释。该功能在glibc中定义为: 函数:退出时为int(void(*函数)(int状态,void*arg,void*arg) 此函数是atexit的一个更强大的变体。它接受两个参数,一个函数和一个任意指针arg。在正常程序终止时,使用两个参数调用函数:传递给exit的状态值和参数 我创建了一个小测试,但我找不到分段错误产生的位置: #include <stdio.h>

出于好奇,我正试图让libc on_exit函数工作,但我遇到了一个分段错误的问题。我遇到的困难是找到正确使用此函数的解释。该功能在glibc中定义为:

函数:退出时为int(void(*函数)(int状态,void*arg,void*arg) 此函数是atexit的一个更强大的变体。它接受两个参数,一个函数和一个任意指针arg。在正常程序终止时,使用两个参数调用函数:传递给exit的状态值和参数

我创建了一个小测试,但我找不到分段错误产生的位置:

#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);
}
#包括
#包括
空虚*
exitfn(整数统计,无效*参数){
printf(“exitfn已在状态%d和*arg%s\n下运行”,stat,(char*)arg);
返回NULL;
}
int
主(空)
{
静态字符*somearg=“退出参数”;
int exit_status=1;
在退出时(exitfn(退出状态,somearg),somearg);
退出(退出成功);
}
编译时使用: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 $./fn\u在\u出口处 exitfn已使用状态1和*arg exit_参数运行 分段故障 诚然,这对于经验丰富的程序员来说很明显,但我没有看到。使用on_exit功能的正确设置是什么?在这种情况下,为什么会生成分段错误?

代码行

  on_exit (exitfn (exit_status, somearg), somearg);
应该是

  on_exit (exitfn, somearg);
因为您不想在此阶段调用
exitfn
(返回NULL!)

代码行

  on_exit (exitfn (exit_status, somearg), somearg);
应该是

  on_exit (exitfn, somearg);

由于您不想在此阶段调用
exitfn
(返回NULL!)

可移植性节点:
atexit
是标准的C<就我所见,code>on_exit是临时的,不是任何标准的一部分。正确的,GNU libc指定on_exit包含在GNU C库中只是为了与SunOS兼容,其他实现可能不支持。然而,在那里,它确实提供了一种基于“int status”或“void*arg”的条件终止/清除机制,如果这是特定代码段中需要的。这大概就是为什么要提到它作为atexit的一个更健壮的替代品的原因。可移植性节点:
atexit
是标准C<就我所见,code>on_exit是临时的,不是任何标准的一部分。正确的,GNU libc指定on_exit包含在GNU C库中只是为了与SunOS兼容,其他实现可能不支持。然而,在那里,它确实提供了一种基于“int status”或“void*arg”的条件终止/清除机制,如果这是特定代码段中需要的。这大概就是为什么要提到它作为脱欧更有力的替代方案的原因。谢谢。我知道这是一个树木问题的森林。所需的修改是:将其设置为“void exitfn”而不是“void*exitfn”,然后按照您指定的“on_exit(exitfn,somearg)”在_exit上使用。此外,将exitfn从“void*”更改为“void”需要删除“return NULL”;还有。@DavidC.Rankin我不想在伤口上撒盐没有盐,我真的很感谢你的帮助。我已经阅读了glibc关于在U出口使用的定义——字面上看,我被难住了。看到这个解决方案马上就有意义了,但如果让我自己的设备去做的话,那就需要很长时间才能实现。谢谢大家!@EdHeal如何在退出时将几个参数传递给
?谢谢。我知道这是一个树木问题的森林。所需的修改是:将其设置为“void exitfn”而不是“void*exitfn”,然后按照您指定的“on_exit(exitfn,somearg)”在_exit上使用。此外,将exitfn从“void*”更改为“void”需要删除“return NULL”;还有。@DavidC.Rankin我不想在伤口上撒盐没有盐,我真的很感谢你的帮助。我已经阅读了glibc关于在U出口使用的定义——字面上看,我被难住了。看到这个解决方案马上就有意义了,但如果让我自己的设备去做的话,那就需要很长时间才能实现。谢谢大家!@EdHeal如何在退出时将多个参数传递给