如果 fork 和 exec 模式仅用于运行程序而不冻结当前程序,那么有什么优势,例如,使用这一行:
system("program &"); // run in background, don't freeze
该system
函数创建一个新的 shell 实例来运行程序,这就是您可以在后台运行它的原因。fork
与/的主要区别exec
在于,system
像这样使用实际上会创建两个进程,即 shell 和程序,并且您不能通过匿名管道直接与新程序通信。
fork+exec 比 system() 轻得多。后者将为 shell 创建一个进程,shell 将解析给定的命令行并调用所需的可执行文件。这意味着更多的内存、更多的执行时间等等。显然,如果程序将在后台运行,这些额外的资源只会暂时消耗掉,但根据你使用它的频率,差异会非常明显。
系统的手册页清楚地说明system
通过“调用 /bin/sh -c命令”来执行命令,这意味着系统至少创建两个进程:/bin/sh
然后是程序(shell 启动文件可能会产生多个进程)
这可能会导致一些问题:
/bin/sh
,或者不使用&
在后台运行进程怎么办?)正确的方法是fork
+ exec
,它只创建一个进程。它使您可以更好地控制性能和资源消耗,并且更容易修改以执行简单、重要的事情(如错误处理)。