У вас есть три разумных варианта для этого, в зависимости от вашей конкретной потребности.
Если различные вызовы, которые вы делаете для внешних инструментов, являются частью когерентной процедуры, вы можете - и, вероятно, должны - следовать советам @ dmi и написать короткий сценарий оболочки, который вы можете вызвать из своей программы на C++.
Если вам нужно начать процедуру здесь и там, вам может быть интересно запустить shell как уступчивый процесс и приложить вашу программу к нему - чтобы вместо того, чтобы разговаривать с вашим терминалом, вашей программы на C++.
Этот метод не очень сложно, но есть несколько подводных камней (например, некоторые программы, такие как SSH,SUDO или докер может ожидать быть присоединен к TTY). Он очень хорошо освещен в большинстве представлений о системном программировании (смотрите inter process communication и подпроцессы) для любого варианта Unix. Позвольте мне изложить эту процедуру:
- использовать систему труб вызов для создания труб (stdin_r, stdin_w)
- использовать систему труб вызов для создания труб (stdout_r, stdout_w)
- использовать систему труб вызов создавать трубы (stderr_r, stderr_w)
- использовать системные вилы вызов, чтобы дублировать программу
- в детстве вы закрываете stdin_w, stdout_r, stderr_r и использовать EXEC системного вызова параметризуется stdin_r, stdout_w, stderr_w к запустите оболочку.
- В родительском блоке вы закрываете stdin_r, stdout_w, stderr_w, и вы можете теперь писать команды в stdin_w и читать команду с stdout_r и stderr_r.
(Это намеренно очень схематично, я включил схему только для того, чтобы вы были уверены, что нашли нужное место в своем любимом учебнике).
Существуют сторонние библиотеки, реализующие все эти низкоуровневые материалы для вас.Вы можете использовать boost::process (который пока не является официальной частью повышения), использование которого проиллюстрировано на full tutorial. Есть plenty of alternatives, например pstreams.
Третий вариант заключается в том, чтобы избежать использования оболочки и выполнения непосредственно команд оболочки, которые вы используете. Это подход, за которым следует Rashell, библиотека OCaml, определяющая примитивы, позволяющие надежно составлять подпроцессы, которые вы можете использовать для своего собственного вдохновения.
Вы можете открыть оболочку в трубе и отправить команды через нее. –
http://stackoverflow.com/questions/245600/using-a-single-system-call-to-execute-multiple-commands-in-c – mstruebing
@mstruebing: Это предполагает, что вы знаете, какие программы запускать, когда и с каким аргументом. Труба - лучшее решение. – MSalters