在libc.so中,exit和_exit有什么区别?

3
(gdb) info symbol exit
exit in section .text of /lib64/libc.so.6
(gdb) info symbol _exit
_exit in section .text of /lib64/libc.so.6

有人知道吗?

1个回答

5
简单来说,exit 是一个高级函数,你应该调用它来退出进程,它会调用 on-exit 处理程序和一些其他高级清理工作。 _exit 是一个低级清理函数,它在 exit 的最后一步被调用。 exit 将通过进行 exit 系统调用来真正终止进程。
来自 glibc 手册 http://www.gnu.org/software/libc/manual/html_mono/libc.html(还可以查看 glibc 的源代码以获取详细信息)。

25.6.1 正常终止

当一个进程通过调用exit来发出程序已完成的信号时,它会正常终止。从main函数返回与调用exit等效,而main返回的值将被用作exit的参数。

— 函数:void exit(int status)

exit函数告诉系统程序已完成,导致终止该进程。

status是程序的退出状态,它成为进程终止状态的一部分。此函数不返回任何值。

正常终止会引起以下操作:

使用atexit或on_exit函数注册的函数按照它们注册的相反顺序调用。这个机制允许您的应用程序指定其自己的“清理”操作,在程序终止时执行。通常,这用于做一些像在文件中保存程序状态信息,或者在共享数据库中解锁锁的事情。

所有打开的流都会关闭,并写出任何缓冲输出数据。请参阅关闭流。此外,使用tmpfile函数打开的临时文件将被删除,请参阅临时文件。

调用_exit,终止程序。请参阅终止内部。

在“终止内部”一节中:

25.6.5 终止内部

_exit 函数是通过 exit 进行进程终止所使用的原语。它在头文件 unistd.h 中声明。

— 函数:void _exit (int status)

_exit 函数是用于使进程以状态 status 终止的原语。调用此函数不会执行已注册 atexit 或 on_exit 的清理函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接