exit() 和 exit_group() 有什么区别?

  • 本文关键字:exit 区别 group linux exit
  • 更新时间 :
  • 英文 :


exit() 和 exit_group() 有什么区别?任何具有多个线程的进程都应该使用 exit_group 而不是退出?

为了回答why do you ask的问题 - 我们有一个有大约 40 个线程的进程。当线程被锁定时,我们会自动退出进程,然后重新启动进程。我们打印被锁定的线程的回溯。我们想知道在这种情况下调用退出是否与exit_group有什么不同。

From the docs: This system call is equivalent to exit(2) except that it terminates not only the calling thread, but all threads in the calling process's thread group - 但是,退出进程和退出所有线程有什么区别。不是退出进程 == 退出所有线程。

我知道的所有线程库(例如最近的 glibc 或 musl-libc)都在使用低级 clone(2) 系统调用来实现它们的线程实现(有些 C 库甚至使用 clonefork进程)。

clone是一个困难的Linux系统调用。除非你是线程库实现者,否则你不应该直接使用它,而只能通过库函数使用它(例如 pthread_create(3));另请参见 pthread_mutex * 函数中使用的 futex(7)

clone syscall 用于创建任务:线程(在多线程进程中共享地址空间)或进程。

exit_group系统调用与退出这些任务有关。

简而言之,您永远不会直接使用 exit_group 或 clone .您的 libc 正在为您做到这一点。所以不要在乎exit_group_Exit;您应该只使用标准库函数 exit(3),它主要处理 atexit(3) 和on_exit(3) 注册的处理程序并刷新缓冲区<stdio.h>。在极少数情况下,您不希望发生这种情况,请使用 _exit(2)(但您可能不需要它)。

当然,如果你从头开始重新实现自己的libc,你需要关心exit_groupclone;但除此之外,你并不关心它们。

如果您关心血腥的实现细节,请深入了解libc的源代码。详细信息可能libc版本、内核版本和编译器特定!

最新更新