std::system和exec哪个更好?这是一个关于IT技术的问题。

9
我有一个程序调用了我自己编写的一个 shell 脚本工具,该工具会遍历一个目录并压缩文件、获取校验和值,然后调用其他工具上传文件。这个操作大约需要 3 到 4 分钟的时间。
我是这样调用脚本的:
int result = system("/bin/sh /path/to/my/script");

我使用exec()函数族得到了相同的结果:

int child = fork();
if(child == 0) {
    execl( "/bin/sh", "sh", "/path/to/my/script", (char*)0 );
}

我知道使用 exec 命令可以将输出重定向到父程序,以便父程序可以读取命令行工具的输出。但除此之外,有哪些情况下你应该使用 system 呢?


请注意,其中一个是可移植的,而另一个则不是。 - François Andrieux
但是很难找到一个可移植的argument来传递给system"/bin/sh ..."肯定不是可移植的。 - rici
2个回答

8
忽略不考虑使用system是可移植的,而使用exec函数族则不可移植...当您将exec函数族与其他POSIX函数(如pipedupwait)结合使用时,您可以更好地控制父进程和子进程之间数据的传递方式。但如果您不需要这些控制,即只想执行一个命令,则我认为使用system更可取。

1
大部分同意。然而,仅凭经验,我更喜欢拥有一个真正灵活的 popen 包装器(例如 Boost.Process),并将其用于基本上所有事情。我唯一的问题是 Boost.Process 在编译时会消耗大量时间。不过它的效果很好。 - Lightness Races in Orbit
@BoundaryImposition,那个包装器能在MS VC++上工作吗?如果可以的话,我很想试一下。 - R Sahu
点击链接然后找出答案!但是我没有理由相信答案是否定的。 - Lightness Races in Orbit
所以根据您的回应,我猜想通用准则是尽可能简单易懂,以便实现可移植性和可读性。 - mjl007

1
你问题中的第一个 system 调用将会执行与你下一段代码(fork 和 execl)相同的操作。
来自文档的说明:
 The system() library function uses fork(2) to create a child process
 that executes the shell command specified in command using execl(3)

http://man7.org/linux/man-pages/man3/system.3.html


3
这是错误的。system() 没有使用 fork() 的理由,并且 system() 可在不支持它(例如 Windows)的平台上使用。 - user2100815
没错,但他的问题特定于Linux或某些类Unix系统,因为他正在使用"fork"和"execl"。 - Pavan Chandaka
仅仅回答一个关于最佳实践的问题,而不透露它们特定于平台的本质,似乎有点不诚实。 - Lightness Races in Orbit
@BoundaryImposition 是的,我同意......但是看到“fork”和“execl”,我倾向于类Unix系统.....而且早些时候当我为跨平台提供一些答案时......我被打得体无完肤.......说,你在问题中哪里看到了Windows.... :) - Pavan Chandaka
1
是的,你错过了重点。重点是最佳实践是 不要 使用 fork 或者 execl,这样你就可以在 Windows(和其他非 Linux 平台)上分享代码。相反,你假定将使用 Linux 方法,并且在讨论 system 时忽略并未提及你的答案实际上也是特定于平台的,因为它忽略了一些 Linux 特有的东西。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接