加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:17:18 所属栏目:Linux 来源:网络整理
导读:exit()和 exit_group()之间有什么区别.任何有多个线程的进程都应该使用exit_group而不是exit? 要回答这个问题,你为什么要问 – 我们的流程大约有40个线程.线程被锁定后,我们会自动退出该进程,然后重新启动该进程.然后我们打印被锁定的线程的回溯.我们想知道
exit()和 exit_group()之间有什么区别.任何有多个线程的进程都应该使用exit_group而不是exit?

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

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

解决方法

我所知道的所有线程库(例如最近的 glibc或 musl-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和编译器特定的!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读