【问题标题】:C++ execute many commands in shellC ++在shell中执行许多命令
【发布时间】:2016-01-07 10:31:04
【问题描述】:

我有一个 C++ 程序,我想在 shell 中执行多个命令。 我当前的解决方案使用 system() 函数,如下所示:

return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_1);
... do_something_else ...
return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_2);
... do_something_else ...
return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_3);
...

它可以工作,但是 SETUP_ENVIRONMENT 需要几秒钟,使程序非常慢。但是我每次都必须运行它,因为 system() 每次都在一个新的 shell 中运行。 我希望能够设置我的 shell 一次,然后在其中运行所有命令。

execute_in_shell(SETUP_ENVIRONMENT);
return_value = execute_in_shell(RUN_USEFUL_APP_1);
... do_something_else ...
return_value = execute_in_shell(RUN_USEFUL_APP_2);
... do_something_else ...
return_value = execute_in_shell(RUN_USEFUL_APP_3);
...

我该怎么做?

我在 Linux 上。

【问题讨论】:

  • 你可以在管道中打开一个shell并通过它发送命令。
  • @mstruebing:这假设您预先知道要运行哪些程序、何时以及使用哪些参数。管道是更好的解决方案。
  • 如何在管道中打开外壳?如果我这样做,我可以看到返回码吗?
  • @oskla129 system 的返回值表示命令是否可以执行,而不是命令的结果。

标签: c++ linux shell


【解决方案1】:

或者回答 1,您还可以使用您的程序创建一个 shell 脚本,该脚本将运行您所有有用的程序并立即执行此脚本。那么对于每个特定的有用程序,shell 不会每次都启动。

【讨论】:

  • 我不确定设置环境是什么,但据我了解,大部分时间都被它消耗了,对吧?也许你可以为你的主进程设置所需的环境,然后所有衍生的进程将自动继承它,这样你就不需要为每个特定的有用程序设置它?如果可能的话,或者考虑一些其他方式来与他们共享环境(即通过文件或共享内存)
【解决方案2】:

根据您的具体需要,您有三个合理的选择。

如果您对外部工具的各种调用是连贯例程的一部分,那么您可以(并且可能应该)遵循@dmi 的建议,编写一个可以从您的 C++ 程序调用的简短 shell 脚本。

如果您需要在这里和那里启动程序,您可能有兴趣将 shell 作为低级进程运行并将您的程序附加到它 - 这样就无需与终端对话,而是shell 进程与您的 C++ 程序对话。

这种方法不是很困难,但有一些陷阱(例如,像 ssh、 sudodocker 这样的一些程序可能期望附加到一个tty)。大多数 Unix 变体的系统编程介绍(寻找进程间通信和子进程)都很好地涵盖了它。让我概述一下该过程:

  1. 使用管道系统调用创建管道(stdin_r、stdin_w)
  2. 使用管道系统调用创建管道(stdout_r、stdout_w)
  3. 使用管道系统调用创建管道(stderr_r、stderr_w)
  4. 使用 fork 系统调用复制您的程序
  5. 在子进程中,您关闭 stdin_w、stdout_r、stderr_r,并使用 exec 系统调用由 stdin_r、stdout_w、stderr_w 参数化到 运行 shell。
  6. 在父级中,您关闭 stdin_r、stdout_w、stderr_w,然后您 现在可以在 stdin_w 中写入命令,并从 stdout_r 和 stderr_r。

(故意非常粗略,我只包括大纲,以便您确定您在最喜欢的教科书中找到了正确的位置。

有第三方库为您实现所有这些低级内容。您可以使用boost::process(现在还不是 boost 的官方部分),其用法以full tutorial 说明。有plenty of alternativespstreams

第三个选项是避免使用 shell 并直接执行你使用的 shell 命令。这是 Rashell 所遵循的方法,这是一个定义原语的 OCaml 库,允许可靠地组合子流程,您可以将其用于自己的灵感。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多