在我一直在阅读的手册页中,似乎popen,system等倾向于调用fork().反过来,fork()复制进程的整个内存状态.这看起来非常重,特别是在很多情况下,来自fork()的调用的子节点几乎没有为父节点分配任何内存.
所以,我的问题是,我可以获得fork()之类的行为,而不会复制父进程的整个内存状态吗?或者有什么我缺少的东西,这样fork()没有它看起来那么重(比如,可能调用往往会被优化以避免不必要的内存重复)?
从用户空间应用的角度来看,fork(2)和所有系统调用一样,是一个原始操作(但有些C库使用clone(2)).它主要是单个机器指令SYSCALL或SYSENTER从用户模式切换到内核模式,然后(最近版本的)Linux内核正在进行非常重要的处理.
它实际上非常有效(例如,小于一毫秒,有时甚至不到十分之一),因为内核广泛使用惰性写时复制技术在父进程和子进程之间共享页面.在覆盖共享页面时,实际复制将在页面错误后发生.
和分叉有着巨大的优势,因为一些其他程序的起始委托给的execve(2) :这是概念上简单:家长和孩子进程之间的唯一区别是结果fork
BTW在POSIX系统上,比如Linux,fork(2)或者合适的clone(2)等价是创建进程的唯一方法(你应该忽略一些奇怪的异常:内核正在制作一些类似的进程/sbin/init等等. ..),因为vfork(2)已经过时了.