C лучший способ запустить другой процесс?

#c #fork #spawn

#c #форк #порождение

Вопрос:

Прошло некоторое время с тех пор, как мне приходилось это делать, и в прошлом я использовал «spawn» для создания процессов.

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

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

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

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

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

Комментарии:

1. @iyasar, потому что, как я сказал в посте, я хочу отдельные процессы, а НЕ потоки.

2. Не существует стандартного способа создания процесса в операционной системе. Вы должны использовать spawn / exec / fork (или любую оболочку вокруг них) в unix, и я не знаю, что в Windows.

3. Повышение. Обработайте, если вам нужна кроссплатформенная поддержка.

4. Запросы на инструменты / библиотеки здесь не по теме.

5. Стандарт C 11 не знает о процессах. Проверьте, прочитав n3337 . Некоторые библиотеки фреймворка ( Boost , POCO , Qt …) знают их.

Ответ №1:

Попробуйте Boost.Процесс.

Повышение.Process предоставляет гибкую структуру для языка программирования C для управления запущенными программами, также известными как процессы. Это позволяет разработчикам C делать то, что разработчики Java могут делать с java.lang.Runtime / java.lang.Разработчики процессов и .NET могут работать с системой.Диагностика.Процесс. Среди прочих функциональных возможностей это включает в себя возможность управлять контекстом выполнения текущего запущенного процесса, возможность создавать новые дочерние процессы и способ взаимодействия с ними с использованием стандартных потоков 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();
  

Комментарии:

1. Я только что загрузил последнюю версию с веб-сайта, это не очень хорошее начало, когда сами заголовки полны недопустимых ссылок на пути, их достаточно просто исправить … также пространство имен ::boost, похоже, не определено. Ошибок так много, что я не уверен, в чем было намерение.

2. @SPlatten где (на каком сайте?) и что вы установили (собрали из исходных текстов / загруженных двоичных файлов / и т.д.) И на какой платформе у вас проблемы?

3. Я нажал на загрузку с сайта boost, размещенную по вашей ссылке. Я работаю на Mac.

4. @Oliort похоже, что эта страница представляет собой 10-летнюю версию кода, давно устаревшую. Почему бы не дать ссылку на обновленную версию, теперь она официально включена в Boost?

5. @SPlatten однако это не «сайт повышения». boost.org/doc/libs/release/doc/html/process.html это последняя версия, и она является частью обычных выпусков Boost.

Ответ №2:

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

 #include <cstdlib>

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

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

Комментарии:

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

2. std::system обычно возвращает значение, возвращаемое вызванной программой, поэтому он ожидает завершения программы.

Ответ №3:

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

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

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

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

Комментарии:

1. как «на платформе posix» соответствует «не специфичен для какой-либо платформы»?

2. @xaxxon Я пропустил эту часть, но с каких пор «posix» является конкретной платформой? 😛 Существует форк pstreams для Windows (но он не поддерживается и не поддерживается).