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

gdb*_*gdb 3 libc exit

(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
Run Code Online (Sandbox Code Playgroud)

有谁知道?

kub*_*uba 5

简单地说,exit它是一个高级函数,您应该调用它来退出进程,它调用退出处理程序和其他一些高级清理内容。_exit是一个低级清理函数,它作为 的最后一步调用exitexit将真正终止进程(通过进行退出系统调用)。

\n

来自 glibc 手册\nat http://www.gnu.org/software/libc/manual/html_mono/libc.html(另请查看 glibc 的源代码以了解详细信息):

\n
\n

25.6.1 正常终止

\n

当进程的程序通过调用 exit 发出已完成的信号时,进程将正常终止。从main返回相当于调用exit,main返回的值作为退出的参数。

\n

\xe2\x80\x94 功能:void exit (int status)

\n

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

\n

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

\n

正常终止会导致以下操作:

\n

使用 atexit 或 on_exit 函数注册的函数按照其注册的相反顺序调用。此机制允许您的应用程序指定要在程序终止时执行的自己的 \xe2\x80\x9ccleanup\xe2\x80\x9d 操作。通常,这用于执行诸如将程序状态信息保存在文件中或解锁共享数据库中的锁之类的操作。

\n

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

\n

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

\n
\n

在“终止内部结构”部分:

\n
\n

25.6.5 终止内部结构

\n

_exit 函数是用于通过退出终止进程的原语。它在头文件 unistd.h 中声明。

\n

\xe2\x80\x94 功能:void _exit (int status)

\n

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

\n
\n