fork + exec模式可以被系统替换(run-command-in-background)?

时间:2012-12-18 16:34:10

标签: c unix

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

man page for system明确表示system通过“调用/ bin / sh -c 命令”执行命令,这意味着系统至少创建 两个进程:/bin/sh然后程序(shell启动文件可能产生多个进程)

这可能会导致一些问题:

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

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