kin*_*er1 1 c linux system-calls
根据vfork()手册页,如果在调用_exit或exec系列调用函数之前vfork()修改除pid_t之外的任何数据,则行为是未定义的.
据我所知,如果通过vfork()调用创建子进程exec(),那么它可以修改任何数据,并且行为仍未定义.
我的问题是:
还知道child共享父地址空间,那么如果使用exec覆盖子,self和parent映像,行为是不是未定义?
如果孩子调用exec并且之后返回,那么父母会发生什么?父母是否开始使用由exec创建的新副本?
该exec调用用一个全新的地址空间替换孩子的整个地址空间.任何共享地址空间都将被调用完全替换.
该vfork函数仅作为优化存在.对于某些操作系统来说,fork非常昂贵,因为子进程可能会修改映射到内存中的任何页面,因此必须修改每个页面以在写入时复制(或者,最初实际复制!),以便不修改父对应的页面.fork紧接着是一个非常常见的序列exec,迫使这些系统重新映射所有页面,以便在一瞬间将它们全部丢弃.而不是去改变所有映射的麻烦,vfork让你离开映射不确定状态的子进程,你不还是要用他们的假设下.
结果,做了一些事后vfork就可以制造出一团糟.但是一旦你打电话exec,所有未定义的映射都会消失.
在实践中,操作系统处理vfork以下两种方式之一:对于操作系统,其中更改所有映射以在写入时复制是廉价的或未实现vfork优化,与之vfork相同fork.对于使用vfork优化的操作系统,vfork让父级和子级完全共享大多数页面,如果子级修改它们会导致不良事件发生(它们在父级中进行修改).
因此,对您的问题的简短回答是,如果vfork以这种方式设计,它将无法用于其唯一的预期目的.
| 归档时间: |
|
| 查看次数: |
526 次 |
| 最近记录: |