2

如果 fork 和 exec 模式仅用于运行程序而不冻结当前程序,那么有什么优势,例如,使用这一行:

system("program &"); // run in background, don't freeze
4

3 回答 3

5

system函数创建一个新的 shell 实例来运行程序,这就是您可以在后台运行它的原因。fork与/的主要区别exec在于,system像这样使用实际上会创建两个进程,即 shell 和程序,并且您不能通过匿名管道直接与新程序通信。

于 2012-12-18T16:37:10.270 回答
1

fork+exec 比 system() 轻得多。后者将为 shell 创建一个进程,shell 将解析给定的命令行并调用所需的可执行文件。这意味着更多的内存、更多的执行时间等等。显然,如果程序将在后台运行,这些额外的资源只会暂时消耗掉,但根据你使用它的频率,差异会非常明显。

于 2012-12-18T16:43:51.413 回答
1

系统的手册页清楚地说明system通过“调用 /bin/sh -c命令”来执行命令,这意味着系统至少创建两个进程:/bin/sh然后是程序(shell 启动文件可能会产生多个进程)

这可能会导致一些问题:

  • 可移植性(如果系统无权访问/bin/sh,或者不使用&在后台运行进程怎么办?)
  • 错误处理(您无法知道进程是否因错误退出)
  • 与流程交谈(您不能向流程发送任何内容,或从中获取任何内容)
  • 性能等

正确的方法是fork+ exec,它只创建一个进程。它使您可以更好地控制性能和资源消耗,并且更容易修改以执行简单、重要的事情(如错误处理)。

于 2012-12-18T16:47:22.993 回答