#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 (но он не поддерживается и не поддерживается).