C ++在shell中执行许多命令

我有一个C ++程序,我想在shell中执行多个命令。 我目前的解决scheme使用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上。

根据您的具体需要,您有三个合理的选择来完成此操作。

如果你对外部工具进行的各种调用是一致的例程的一部分,那么你可以 – 也许应该 – 遵循@ dmi的建议,并编写一个简短的shell脚本,你可以从你的C ++程序调用。

如果你需要在这里和那里启动程序,你可能会感兴趣的是将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,并使用由stdin_r,stdout_w,stderr_w参数化的exec系统调用来运行该shell。
  6. 在父项中,关闭stdin_r,stdout_w,stderr_w,现在可以在stdin_w中写入命令,并从stdout_r和stderr_r中读取命令输出。

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

有第三方库为你实现所有低级的东西。 您可以使用boost :: process (现在还不是boost的官方部分),其用法用完整的教程进行说明 。 有很多替代品 ,如pstreams 。

第三个选项是避免使用shell并直接执行你使用的shell命令。 Rashell是一个OCaml库,它定义了允许可靠地编写子流程的原语,您可以使用它来获得自己的灵感。

或者回答1,您也可以使用您的程序来创建一个shell脚本,它将运行所有有用的程序并立即执行此脚本。 然后每个特定的有用程序每次都不会启动shell。