我有一个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, sudo或docker可能会被附加到一个tty )。 对于任何Unix变体,系统编程的大多数介绍(查找进程间通信和子进程 )都有很好的介绍。 让我概述一下这个过程:
(这个故意非常粗略,我只包括大纲,以便你确定你在你喜欢的教科书中找到正确的位置)。
有第三方库为你实现所有低级的东西。 您可以使用boost :: process (现在还不是boost的官方部分),其用法用完整的教程进行说明 。 有很多替代品 ,如pstreams 。
第三个选项是避免使用shell并直接执行你使用的shell命令。 Rashell是一个OCaml库,它定义了允许可靠地编写子流程的原语,您可以使用它来获得自己的灵感。
或者回答1,您也可以使用您的程序来创建一个shell脚本,它将运行所有有用的程序并立即执行此脚本。 然后每个特定的有用程序每次都不会启动shell。