为什么posix-spawn强制在linux中使用vfork?

时间:2012-10-21 02:51:37

标签: ruby linux

我已经查看了posix-spawn(https://github.com/rtomayko/posix-spawn)的代码,似乎它在低级实现中使用了vfork。但是,不鼓励vfork在linux平台中使用。使用posix它没关系-spawn模块?

1 个答案:

答案 0 :(得分:5)

建议不要使用

vfork,因为它会严重限制新进程可以执行的操作(直到exec s)并因此难以正确使用。在Linux上,fork使用写时复制语义,因此fork速度相当快,无需使用vfork。此外,vfork信号语义在各个平台上都不是标准的。来自man vfork

  

令人遗憾的是,Linux从过去恢复了这个幽灵。 BSD手册页指出:

     
    

当实施适当的系统共享机制时,将取消此系统调用。用户不应该依赖vfork()的内存共享语义,因为它会与fork(2)同义。

  
     

信号处理的细节不明确,系统之间也有所不同。 BSD手册页指出:

     
    

为了避免可能的死锁情况,vfork()中间的子进程永远不会发送SIGTTOUSIGTTIN信号;相反,允许输出或ioctl s,输入尝试将导致文件结束指示。

  

也就是说,如果使用得当,vfork可能会有用,而且在许多其他平台上它会更快。 Linux确实支持它,所以如果代码不做任何受vfork限制的事情,那么在Linux上应该没问题。