为什么在创建子进程后立即调用exec()或exit()时使用vfork()?

提姆

操作系统概念和APUE说

通过vfork(),父进程被挂起,子进程使用父进程的地址空间。由于vfork()不使用写时复制,因此,如果子进程更改了父级地址空间的任何页面,则父级恢复后,更改后的页面将对父级可见。因此,必须谨慎使用vfork()以确保子进程不会修改父进程的地址空间。

vfork()旨在在子进程创建后立即调用exec()或exit()时使用。

我如何理解最后一句话?

当通过vfork()调用创建子进程时exec(),是否exec()通过加载新程序来修改父进程的地址空间?

当通过vfork()调用创建子进程时,终止子进程时exit()是否exit()不修改父进程的地址空间?

我偏爱Linux。

谢谢。

斯蒂芬·基特

当通过vfork()调用创建子进程时exec(),是否exec()通过加载新程序来修改父进程的地址空间?

不,exec()为新程序提供新的地址空间;它不会修改父地址空间。例如exec请参见有关POSIX中功能的讨论Linuxexecve()联机帮助页

当由vfork()创建的子进程调用exit()时,终止子进程时exit()是否不会修改父进程的地址空间吗?

Plainexit()可能会–运行由正在运行的程序(包括其库)安装的出口挂钩。vfork()更严格;因此,在Linux上,它要求的使用_exit()调用C库的清理功能。

vfork()事实证明,很难做到正确;在POSIX标准的当前版本中已将其删除,posix_spawn()应改为使用。

但是,除非你真的知道你在做什么,你应该没有任何使用vfork()posix_spawn(); 坚持好老fork()exec()

上面链接的Linux联机帮助页提供了更多上下文:

但是,在糟糕的过去fork(2),通常需要在不必要的情况下完全复制调用方的数据空间,因为通常在此之后立即exec(3)进行一次。因此,为了提高效率,BSD引入了vfork()系统调用,该系统调用没有完全复制父进程的地址空间,而是借用了父进程的内存和控制线程,直到execve(2)发生了对调用或退出的调用当孩子使用其资源时,父进程被暂停。的使用vfork()非常棘手:例如,在父进程中不修改数据取决于知道哪些变量保存在寄存器中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Python

为什么在使用子进程时出现FileNotFoundError?

来自分类Java

为什么在创建弹簧容器后立即将其销毁?

来自分类Dev

如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

来自分类Dev

为什么docker exec会在退出时杀死nohup进程?

来自分类Dev

为什么由于分段错误而终止的子进程不会立即死亡?

来自分类Dev

为什么派生的子进程在我分叉后立即退出?

来自分类Dev

为什么要在等待后检查WIFEXITED以杀死Linux系统调用中的子进程?

来自分类Dev

为什么在Intent Service启动后立即调用onDestroy()?

来自分类Dev

为什么在使用JetPack Navigation导航后立即调用片段中的onDestroyView

来自分类Dev

使用process.exit(1)终止进程时返回什么?

来自分类Dev

为什么Windows上的sh不能正确使用Python的子进程调用?

来自分类Dev

创建后立即删除RabbitMQ队列。为什么?

来自分类Dev

如何使子进程完成后立即返回以运行父进程(当我们执行fork时)?

来自分类Dev

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

来自分类Dev

调用vfork时,父进程是否真的暂停了?

来自分类Dev

为什么在实例化后立即调用dealloc?

来自分类Dev

为什么vfork()导致父进程崩溃(段错误)?

来自分类Dev

为什么waitpid系统调用只能与子进程一起使用?

来自分类Dev

为什么要使用立即调用的函数来创建新对象?

来自分类Dev

创建子进程并在调用该进程后将其杀死

来自分类Dev

为什么`login`和`sudo`派生一个子进程,而不是立即执行exec()?

来自分类Dev

为什么在子进程调用了exec函数之一之后,该进程为何不能更改其子进程的进程组ID?

来自分类Dev

为什么在打印“这是子进程!”后停止执行?

来自分类Dev

分叉后立即调用exec()的子进程怎么不需要父地址空间的单独副本?

来自分类Dev

手动杀死进程后,为什么在使用“ jobs”命令时显示进程?

来自分类Dev

查找:使用子进程时缺少`-exec'的参数

来自分类Dev

在子进程中 fork() 后泄漏,为什么?

来自分类Dev

子进程调用 find -exec 不执行

来自分类Dev

为什么使用Python脚本调用jar文件后立即终止?

Related 相关文章

  1. 1

    为什么在使用子进程时出现FileNotFoundError?

  2. 2

    为什么在创建弹簧容器后立即将其销毁?

  3. 3

    如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

  4. 4

    为什么docker exec会在退出时杀死nohup进程?

  5. 5

    为什么由于分段错误而终止的子进程不会立即死亡?

  6. 6

    为什么派生的子进程在我分叉后立即退出?

  7. 7

    为什么要在等待后检查WIFEXITED以杀死Linux系统调用中的子进程?

  8. 8

    为什么在Intent Service启动后立即调用onDestroy()?

  9. 9

    为什么在使用JetPack Navigation导航后立即调用片段中的onDestroyView

  10. 10

    使用process.exit(1)终止进程时返回什么?

  11. 11

    为什么Windows上的sh不能正确使用Python的子进程调用?

  12. 12

    创建后立即删除RabbitMQ队列。为什么?

  13. 13

    如何使子进程完成后立即返回以运行父进程(当我们执行fork时)?

  14. 14

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

  15. 15

    调用vfork时,父进程是否真的暂停了?

  16. 16

    为什么在实例化后立即调用dealloc?

  17. 17

    为什么vfork()导致父进程崩溃(段错误)?

  18. 18

    为什么waitpid系统调用只能与子进程一起使用?

  19. 19

    为什么要使用立即调用的函数来创建新对象?

  20. 20

    创建子进程并在调用该进程后将其杀死

  21. 21

    为什么`login`和`sudo`派生一个子进程,而不是立即执行exec()?

  22. 22

    为什么在子进程调用了exec函数之一之后,该进程为何不能更改其子进程的进程组ID?

  23. 23

    为什么在打印“这是子进程!”后停止执行?

  24. 24

    分叉后立即调用exec()的子进程怎么不需要父地址空间的单独副本?

  25. 25

    手动杀死进程后,为什么在使用“ jobs”命令时显示进程?

  26. 26

    查找:使用子进程时缺少`-exec'的参数

  27. 27

    在子进程中 fork() 后泄漏,为什么?

  28. 28

    子进程调用 find -exec 不执行

  29. 29

    为什么使用Python脚本调用jar文件后立即终止?

热门标签

归档