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