我有一个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上。
答案 0 :(得分:1)
除了回答1之外,您还可以使用您的程序创建一个shell脚本,该脚本将运行所有有用的程序并立即执行此脚本。然后每次为每个特定的有用程序启动shell。
答案 1 :(得分:0)
根据您的具体需要,您有三种合理的选择。
如果您对外部工具进行的各种调用都是连贯例程的一部分,那么您可以 - 并且可能应该 - 遵循@dmi的建议并编写一个可以从C ++程序调用的简短shell脚本。
如果你需要在这里和那里开始程序,你可能有兴趣将 shell 作为一个劣质过程运行并将你的程序附加到它 - 所以这不是与你的终端交谈, shell进程与您的C ++程序进行对话。
这种方法并不是很困难,但有一些问题(例如,某些程序,如 ssh, sudo 或 docker 可能会出现这种情况附加到 tty )。对于任何Unix变体,系统编程(查找进程间通信和子进程)的大多数介绍都非常清楚。让我概述一下这个程序:
(这个故意非常粗略,我只包括了大纲,以便你确定在你最喜欢的教科书中找到了正确的位置)。
有第三方库为您实现所有低级别的东西。您可以使用boost::process(现在还不是正式提升的官方部分),其使用情况用full tutorial来说明。有plenty of alternatives,例如pstreams。
第三个选项是避免使用shell并直接执行您使用的shell命令。这是Rashell所遵循的方法,这是一个OCaml库定义基元,允许可靠地组合子过程,您可以将它们用于自己的灵感。