linux – exit()和exit_group()之间的区别是什么

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

要回答这个问题,你为什么要问 – 我们的流程大约有40个线程.线程被锁定后,我们会自动退出该进程,然后重新启动该进程.然后我们打印被锁定的线程的回溯.我们想知道在这种情况下调用exit是否与exit_group有任何不同.

从文档:这个系统调用等同于exit(2),除了它不仅终止调用线程,而且终止调用进程的线程组中的所有线程 – 但是,退出进程和退出所有线程之间有什么区别.是不退出进程==退出所有线程.

解决方法

我所知道的所有线程库(例如最近的 glibcmusl-libc)都使用低级别 clone(2) system call进行线程实现(并且一些C库甚至使用clone来分叉进程).

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

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

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

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

当然,如果你从头开始重新实现自己的libc,你需要关心exit_group&克隆;但除此之外你不关心他们..

如果您关心血腥实现细节,请深入了解libc的源代码.详细信息可能是libc-version,kernel-version和编译器特定的!

相关文章

insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...