exit()和exit_group()之间有什么区别

时间:2014-11-26 16:30:59

标签: linux exit

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

回答问题why do you ask - 我们的流程大约有40个线程。线程被锁定后,我们会自动退出该进程,然后重新启动该进程。然后我们打印被锁定的线程的回溯。我们想知道在这种情况下调用exit是否与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 - 但是,退出进程和退出所有线程之间的区别是什么。不会退出进程==退出所有主题。

1 个答案:

答案 0 :(得分:4)

我所知道的所有线程库(例如最近的glibcmusl-libc)都在使用低级clone(2) system call进行线程实现(有些C库甚至是使用clonefork进程)。

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

中使用的pthread_mutex

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

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

简而言之,您永远不会直接使用 exit_groupclone。你的libc正在为你做这件事。所以不要关心exit_group_Exit;你应该只使用标准库函数exit(3),它特别涉及atexit(3)&amp; on_exit(3)注册处理程序并刷新<stdio.h>个缓冲区。在极少数情况下,您不希望发生这种情况,请使用_exit(2)(但您可能不需要)。

当然,如果您从头开始重新实现自己的libc,则需要关注exit_group&amp; clone;但除此之外你不关心它们。

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