C ++ лучший способ запустить другой процесс? - PullRequest
0 голосов
/ 03 апреля 2019

Прошло много времени с тех пор, как я должен был это сделать, и в прошлом я использовал "spawn" для создания процессов.

Теперь я хочу запустить процессы из моего приложения асинхронно, чтобы мое приложение продолжало выполняться в фоновом режиме и не задерживалось при запуске процесса.

Я также хочу иметь возможность общаться с запущенными процессами. Когда я запускаю процесс, я отправляю ему идентификатор процесса запуска, чтобы запущенный процесс мог связываться с модулем запуска, используя его pid.

Каков наилучший метод для использования, не относящийся к какой-либо платформе / операционной системе, я ищу решение, которое является мультиплатформенным?

Я пишу это на C ++, я не хочу, чтобы решение связывало меня с каким-либо сторонним лицензированным продуктом.

Я не хочу использовать потоки, решение должно быть для создания новых процессов.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Попробуйте Boost.Process .

Boost.Process предоставляет гибкую среду для языка программирования C ++ для управления запущенными программами, также известными как процессы.Это позволяет разработчикам C ++ делать то, что разработчики Java могут делать с java.lang.Runtime / java.lang.Process, а разработчики .NET могут делать с System.Diagnostics.Process.Среди других функций это включает в себя возможность управления контекстом выполнения текущего запущенного процесса, возможность порождать новые дочерние процессы и способ связываться с ними с помощью стандартных потоков C ++ и асинхронного ввода-вывода.

Библиотека разработана таким образом, чтобы прозрачно абстрагировать все детали управления процессами от пользователя, что позволяет безболезненно разрабатывать кроссплатформенные приложения.Однако, поскольку такие абстракции часто ограничивают возможности разработчика, инфраструктура обеспечивает прямой доступ к специфическим функциям операционной системы - очевидно, теряя возможности переносимости библиотеки.

Пример кода для запуска и ожидания завершениядля дочернего процесса с сайта:

bp::child c(bp::search_path("g++"), "main.cpp");

while (c.running())
    do_some_stuff();

c.wait(); //wait for the process to exit   
int result = c.exit_code();
0 голосов
/ 03 апреля 2019

Портативный для запуска нового процесса: std :: system .

#include <cstdlib>

int main() {
   std::system("./myapp");
   return 0;
}

если вы используете linux и хотите разделить дескрипторы / память между процессами, fork - это то, что вы ищете

0 голосов
/ 03 апреля 2019

Я подключу свою собственную маленькую библиотеку (с одним заголовком):

PStreams позволяет запускать другую программу из приложения C ++ и передавать данные между двумя программами, аналогичными оболочкеpipelines.

В простейшем случае класс PStreams подобен оболочке C ++ для функций POSIX.2 popen (3) и pclose (3) с использованием iostreams C ++ вместо библиотеки stdio языка C.

Библиотека предоставляет шаблоны классов в стиле стандартных iostreams, которые можно использовать с любым компилятором ISO C ++ на платформе POSIX.Классы используют класс streambuf, который использует fork (2) и семейство функций exec (2) для создания нового процесса и создает до трех каналов для записи / чтения данных в / из процесса.

...