【问题标题】:Is there a cross-platform exec in Boost?Boost 中是否有跨平台执行?
【发布时间】:2009-10-15 22:23:59
【问题描述】:

我想在 C++ 中执行一个子进程。我需要它在 Windows 和 Linux 上工作。 Boost中有这样的功能吗? 标准的做法是什么?

【问题讨论】:

    标签: c++ cross-platform exec subprocess


    【解决方案1】:

    还有尚未批准的 Boost.Process 库。我从未尝试过,但它可能会为你完成这项工作。

    不过,我已经成功使用了Poco 的 Process API。

    【讨论】:

      【解决方案2】:

      PocoACE 具有可以满足您需求的 Process 类。参见 Poco 中的 Foundation->Processes->Process; Ace 的 Process.h/Process.cpp。如果QT 有类似的东西,我不会感到惊讶。

      至于怎么做,基本上就是把操作系统依赖包起来,埋头苦干。 Poco 和 Ace 提供了对比鲜明的常用方法。 Poco 倾向于通过为每个平台编写实现对象 (xxx_impl) 来处理事情,并根据操作系统引入适当的对象。 ACE 似乎 #ifdef 代码,有时甚至到了疯狂的地步,但公平地说,我已经很久没有看过那个代码了。

      【讨论】:

        【解决方案3】:

        您想要什么级别的控制?标准包括system(),可以执行一个子流程。如果你想控制标准输入或标准输出,你可以使用popen(虽然MS通常称它为_popen)。如果您想要比这更复杂的东西,您只需要寻找其他地方。

        【讨论】:

          【解决方案4】:

          ANSI C89 system() 存在于两个平台上。显然,该过程做什么取决于它是否可以在平台之间移植。但你当然不需要提升来做到这一点。

          【讨论】:

          • system() 只是将命令转发到底层 shell。它不允许您读取标准输出流,或将数据发送到标准输入流。
          • 不过,这个问题并不要求 stdio 重定向。无论如何,这些平台之间的外部工具通常也不可移植。
          • 如果您需要使用 system(),并且想要重定向 stdout 或 stderr,只需将所有数据通过管道传输到文本文件中,稍后再读取。
          • 不要调用 system() - 它不安全:securecoding.cert.org/confluence/pages/…
          猜你喜欢
          • 1970-01-01
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多