为什么最小的二进制调用exit_group而不是退出?

Why does a minimal binary call exit_group instead of exit?

提问人:Mario Ishac 提问时间:11/10/2023 更新时间:11/10/2023 访问量:53

问:

内容:app.c

void main() {}

我执行得到:gcc app.c -o app -static -O3 && lurk ./app

execve("", "", "") = 0
arch_prctl(12289, 0x7FFFFFFFD430) = -22
brk(0x0) = 0x4C4000
brk(0x4C51C0) = 0x4C51C0
arch_prctl(4098, 0x4C4880) = 0
uname(0x7FFFFFFFD210) = 0
readlink("/proc/self/exe", ..., 4096) = 54
brk(0x4E61C0) = 0x4E61C0
brk(0x4E7000) = 0x4E7000
mprotect(0x4BD000, 12288, 1) = 0
exit_group(4200240) = ?

的手册页说:exit_group

这个系统调用等同于 exit(2),只不过它不仅终止了调用线程,还终止了调用进程线程组中的所有线程。

但是,没有启动任何新线程,这在跟踪的 sys 调用中可以看出。为什么当时发出不必要的,而不是?appgccexit_groupexit

c gcc 系统调用 glibc

评论

1赞 Shawn 11/10/2023
在调用的样板代码中使用它可能比尝试弄清楚程序是否使用线程更容易。main()
0赞 Andrew 11/10/2023
另请参阅 stackoverflow.com/questions/27154256/...

答:

1赞 Allan Wind 11/10/2023 #1

在 glibc 中,提交 8fabe0e632bd441c760f878d1022c378f04f8497 从 切换到 ,并显示以下提交消息:exitexit_group

Linux:从 _exit 中删除退出系统调用

exit 只终止当前线程,而不是整个进程,因此在此上下文中是错误的回退系统调用。无论如何,所有受支持的 Linux 版本都会实现 exit_group 系统调用。