Есть ли способ не дождаться завершения команды system()? (с)
Похожий на:
программа не выполняет ничего после вызова system()
Я довольно плохо знаком с использованием C, но в основном я хочу выполнить следующую строку:
int a = system("python -m plotter");
который запустит модуль Python, который я разработал. Однако я хочу, чтобы остальная часть моей программы на c продолжала работать, а не дожидалась завершения выполнения команды (приложение python находится в бесконечном цикле, поэтому оно не закрывается автоматически). Есть ли способ сделать это с помощью C/C++?
Обновление: решение было:
int a = system("start python -m plotter &");
Ответы
Ответ 1
system()
просто передает свой аргумент оболочке (в Unix-подобных системах, обычно /bin/sh
).
Попробуйте следующее:
int a = system("python -m plotter &");
Конечно, значение, возвращаемое system()
, не будет состоянием выхода python script, так как оно еще не закончено.
Это, скорее всего, будет работать только на Unix-подобных системах (возможно, включая MacOS); в частности, он, вероятно, не будет работать в MS Windows, если вы не работаете под Cygwin.
В Windows system()
возможно вызывает cmd.exe
, который не принимает команды с тем же синтаксисом, который используется в Unix-подобных системах. Но команда Windows start
должна выполнить задание:
int a = system("start python -m plotter");
Пока вы пишете код, специфичный для Windows (start
не будет работать в Unix, если у вас не будет команды start
в $PATH
), вы можете подумать об использовании некоторых более низкоуровневых Windows, возможно, позвонив StartProcess
. Это сложнее, но, скорее всего, даст вам больше контроля над тем, как выполняется процесс. С другой стороны, если system()
соответствует вашим требованиям, вы можете также использовать его.
Ответ 2
В стандартной библиотеке нет способа, но вы можете разблокировать или создать отдельный поток, который будет запускать его на фоне, если ваша ОС поддерживает его.
Ответ 3
Я считаю, что если вы добавите '&' до конца команды он будет работать. '& Амп;' говорит команде запускать в фоновом режиме
int a = system("python -m plotter &");
Ответ 4
Команда "System" в Linux позволит остальной части кода выполнять только тогда, когда она выполнила сам.
Вы должны использовать fork(), если хотите одновременную обработку.
Ответ 5
Слово для этого - вызов асинхронной функции/метода. C и С++ не имеют такой функции, поэтому вам нужно либо вызвать функцию в отдельном потоке, либо использовать системный вызов, который будет запускаться в отдельном процессе. Оба эти метода имеют тенденцию быть специфичными для платформы, хотя существуют библиотеки потоковой обработки с поперечной платформой.
Я знаю, что в unix для этого в отдельном процессе вы бы использовали fork (2) для создания нового процесса и exec (3), чтобы выполнить новую программу в этом процессе. Я не знаю, какие системные вызовы потребуются в Windows, но должно быть что-то подобное.