我尝试理解/usr/sbin/service
包含一行代码的经典服务脚本:
exec env -i ...... ${SERVICE} .....
我知道该exec
命令不会分叉,并且会保留进程并将进程映像替换为命令。那么当前的进程就像使用 COMMAND 执行一样。
关于env
?也会像上面那样吗?
为什么替换当前进程比分叉更好?
答案1
它使用的原因env -i
是在执行命令的其余部分之前清除环境变量。
要真正回答你的问题,请考虑 Windows:
在 Windows 中,它们为您提供“CreateProcess”,这似乎是启动新程序的一种非常明智的方式。但 CreateProcess 的问题是,您可能需要为新进程设置数十个设置,并且对于每个设置,您都需要 CreateProcess 函数调用的另一个参数。这限制了父母对孩子的控制程度。
在 Unix 中,他们提出了这样的想法:一个进程首先克隆自身(继承所有进程设置),然后第二个副本可以更改其设置,最后用新程序替换自己。这使您可以使用任何/所有系统调用来更改当前目录、环境、文件句柄、打开套接字、信号掩码等内容,而无需将其中每一个作为参数添加到 CreateProcess 等内容中。
然后,一个巧妙的能力是“链接”执行不同启动操作的程序。每个程序都会对其自身进行一些更改,然后“执行”到下一个程序。 env
是这些程序之一。它修改自己的环境,然后执行另一个程序。看CHPST这是一个很好的例子,说明了您可以在要启动的程序中更改的所有内容。