【问题标题】:Is std::system or exec better practice?std::system 或 exec 是更好的做法吗?
【发布时间】:2017-04-19 16:55:25
【问题描述】:

我有一个程序调用我制作的 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 而不是exec

【问题讨论】:

  • 注意一个是便携的,另一个不是。
  • 但是很难找到可移植的system参数"/bin/sh ..." 肯定不会是便携的。

标签: c++


【解决方案1】:

暂时忽略system的使用是可移植的,而exec系列函数的使用是不可移植的......

当您将 exec 系列函数与其他 POSIX 函数(例如 pipedupwait)结合使用时,您可以更好地控制如何在父进程和子进程之间传递数据过程。

当您不需要任何这些控件时,即您只想执行一个命令,那么使用 system 更可取,IMO。

【讨论】:

  • 基本同意。然而,纯粹是轶事,我更喜欢有一个适当灵活的popen 包装器(例如Boost.Process)来处理基本上所有事情。我唯一的问题是,由于某种原因,Boost.Process 是一个编译时间杀手。不过效果很好。
  • @BoundaryImposition,该包装器是否适用于 MS VC++?如果是这样,我很想亲自动手。
  • 点击链接一探究竟!但我没有理由相信答案是否定的。
  • 所以从您的回复来看,我猜一般的经验法则是为了便携性和可读性使其尽可能简单。
【解决方案2】:

您问题中的第一个 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

【讨论】:

  • 这是错误的。 system() 没有理由使用 fork(),system() 在不支持它的平台上可用,例如 Windows。
  • True.. 但他的问题是特定于 linux 或某些类似 unix 的系统,因为他使用“fork”和“execl”
  • 用仅 Linux 的事实(甚至不透露其特定于平台的性质)回答要求最佳实践的问题似乎有点不诚实。
  • @BoundaryImposition 是的,我同意....但是看到“fork”和“execl”,我倾向于使用类似 Unix 的系统.....而且早些时候我给出了一些跨平台的答案.....我被打死了.......说,你在哪里看到有问题的窗户...... :)
  • 是的,所以,你错过了重点。关键是最佳实践是使用forkexecl,以便您可以在Windows(和其他非Linux平台)上共享代码.相反,您假设将使用 Linux 方法,以至于您的答案在讨论 system 时做出了特定于 Linux 的假设,而忽略并且没有提及实际上您的答案也是特定于平台的。
猜你喜欢
  • 2019-10-17
  • 2014-12-15
  • 2016-08-17
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多