Когда мне было нужно нечто подобное, попробовал две разные версии этого boost.process. Одна не работала без -std=c++11, другая не дружила с современным бустом. В итоге налабал на коленке собственный костыль, брат жив.
Это действительно подходит. Но почему-то не работает если имя программы содержит скобки (по крайней мере в винде). Это не большая проблема, но почему так?
Лолд, святая наивность, загугли whyjohnnycantexec для общего образования что ли.
Например, что будет с сигнал-хендлерами на промежутке между (в)форком и экзеком? Или что будет если в оффтопе нужно пускать процессы из разных тредов и при этом поддерживать XP?
но множество этих символов и способ экранирования системо-зависимы (в венде, скажем, «\» это нормальный символ и используется в путях, как там экранировать я не помню, возможно через «^»)
Либо бери каждый аргумент в двойные кавычки
ProgramName(Debug).exe > "ProgramName(Debug).exe"
но тут нужно учесть что в аргументе также могут быть двойные кавычки и их, опять таки, нужно экранировать.
На самом деле хотя бы из-за этого system - говно, и лучше написать под #ifdef для windows - CreateProcess или как там его, для всего остального - fork+exec.
Существуют ли кроссплатформенные возможности запустить программу из другой программы на C++?
Ты же понимаешь, что кроссплатформенно означает для десктопных приложений запустить под Mac, Win, Lin, а для серверных под Linux и Windows. Большей кроссплатформенности, пока не заплатят отдельно, не требуется. При такой формулировке задача сильно упрощается. Если не найдешь готовое решение, то просто пишешь собственную обертку с реализациями под все 2 или 3 платформы.
Нет не забыл. Солярку ставят либо мегаэнтерпрайзные админы, когда знают что и для чего они делают (их единицы) либо детишки, которые решили выпендриться. БСД - чистый выпендреж (ну, еще нетфликс, который в ядре всерьез копается). То и другое занимает хорошо если пресловутый 1% в Unix-подобных ОС. В любом случае, если люди выбирают экзотику, то пусть сами платят за свой выбор (временем на адаптацию моего программного продукта под свою ОС, либо деньгами тому, кто адаптирует).
Я свое время на поддержку экзотики тратить не стану и никто из разработчиков не станет. Поддержка подразумевает как минимум сборку и тестирование продукта под всеми поддерживаемыми платформами, причем как раз в тот момент, когда разработка очередного функционала завершена и уже хочется закоммитить и перестать об этом думать. И не важно насколько API солярки отличается от Linux, все равно нужно прогнать весь цикл сборки-тестирования (да еще и поддерживать окружение для тестирования). Более того, для тестирования приложения под виндой (все нужные версии) есть appveyor, для Linux и Mac есть travis. Как тестировать под соляркой? Найди любого разработчика и предложи ему нахаляву установить куда-то солярку, регулярно ее обновлять и после каждого коммита гонять под ней тесты... Любой вменяемый разработчик задумается, а зачем это нужно?
Солярка и BSD для фанатов и матерого энтарпрайза, который понимает, что делает. Вот эти люди пусть и занимаются поддержкой софта на этих платформах за свой счет.
Сейчас вообще тенденция к поддержке одной платформы - Docker. Так что хочешь поддержку солярки - запускай на ней эмуляцию Linux, Docker и в докере контейнер с приложением. Нативный пакет за отдельную плату.
не ну, я ж не знаю, что там ТСу надо. Как по мне, если можно, то я бы лично Кьюта чуток притащил. Ну а так то мы все прекрасно знаем, что оно там в середине банально реализовано через ifndef, я думаю и ТС об этом знает и ему не составит особого труда написать самому(ну или извлечь из кьюта самого) эту часть исходника
Qt у меня совсем не используется.
Заметил вот что. Похоже что system() выполняет программу в том потоке, который её вызвал (по крайней мере в Windows). А мне надо запускать новый процесс.
Похоже что system() выполняет программу в том потоке, который её вызвал
API вызова system() предполагает, что функция вернёт код выхода программы. Ну а чтоб получить код выхода логично, что надо подождать пока запускаемый процесс не завершится (что, однако, не препятствует процессу форкнуться и демонизироваться).