【发布时间】:2019-11-13 18:16:12
【问题描述】:
C 标准规定...
...从对
main函数的初始调用返回等效于以主函数返回的值作为参数调用exit函数。
据我所知,这通常由 C 运行时支持代码 (crt0.c) 通过执行此操作来实现 -- 使用来自 main 的返回值调用 exit。
result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
exit (result);
exit(main(argc, argv, envp));
但是,当我编写自己的 exit 版本时,它不会被调用:
#include <stdio.h>
#include <stdlib.h>
void exit( int rc )
{
puts( "ok" );
fflush( stdout );
}
int main()
{
return 0;
}
这不会产生我预期的“ok”输出。显然我在这里遗漏了什么?
上下文:我正在实现一个 C 标准库,只是 ISO 部分,即没有 crt0.c。我希望现有的系统运行时会调用my own exit implementation,因此“我的”清理(如刷新和关闭流、处理用atexit 注册的函数等)将在从链接到我的库的main 返回时自动运行。显然不是这样的,我只是不明白为什么不。
【问题讨论】:
-
“标准库”的某些功能通常在库本身和编译器及其支持对象和库文件之间进行拆分。
exit和atexit函数通常由编译器及其支持文件而不是标准库处理。 -
这仅仅是因为运行时已经链接到原始的
exit实现。很可能它被内联到_start函数中。 -
如何编写自己的
exit版本并同时包含stdlib.h?这是您自己的版本,即 stdlib.c 还是等效版本? -
@Lundin:注意最后给出的上下文。 The real code 是我自己的
exit,和我自己的<stdlib.h>。问题中的代码仅用于演示目的。 -
是的,我读到了,但是这个 .c 文件是您的库实现还是一些随机测试文件并不明显。例如,我不希望您的标准库包含 main()。