为什么 vfork 或 fork 的孩子应该调用 _exit() 而不是 exit()?

Sen*_*Sen 13 c system-calls fork exit

从手册页vfork()

vfork() 与 fork() 的不同之处在于父进程被挂起,直到子进程调用 execve(2) 或 _exit(2)。子进程与其父进程共享所有内存,包括堆栈,直到子进程发出 execve()。子进程不能从当前函数返回或调用 exit(),但可以调用 _exit()。

为什么孩子应该使用 an_exit()而不是简单地调用exit()?我希望这适用于vfork()fork()

Gil*_*il' 12

正如前面看到的vfork不允许子进程来访问父进程的内存。exit是一个C库函数(这就是为什么它常写exit(3))。它执行各种清理任务,例如刷新和关闭 C 流(通过在 中声明的函数打开的文件stdio.h)以及执行在 中注册的用户指定的函数atexit。所有这些任务都涉及读取和写入进程内存。

_exit没有清理就退出。它直接是一个系统调用(这就是为什么它写为_exit(2)),通常通过将系统调用号放在处理器寄存器中并执行特定的处理器指令(分支到系统调用处理程序)来实现。这不需要访问进程内存,因此在vfork.

之后fork,没有这样的限制:父子进程现在是完全自主的。