LINUX.ORG.RU
Ответ на: комментарий от BRE

Как-то процесс запустить и руками не сложно, от библиотеки обычно требуются качество и стабильность.

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

стабильной версии не имеет

Ага, прям супер сложная либа, что ты ее к Арчу приравнял.

Pavval ★★★★★
()

#ifdef WIN32 ну ты понел. Будет в тысячу раз проще чем тащить лишнюю либу которую ты сам еще должен будешь сопровождать.

Edible
()
Ответ на: комментарий от Gvidon

boost.process
Не имеет никакого отношения к бусту, стабильной версии не имеет

Почему называется Boost если, не имеет отношения к бусту? В чём проявляется нестабильность?

user08
() автор топика
Ответ на: комментарий от BRE

Когда мне было нужно нечто подобное, попробовал две разные версии этого boost.process. Одна не работала без -std=c++11, другая не дружила с современным бустом. В итоге налабал на коленке собственный костыль, брат жив.

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

-std=c++11

а ты без него собираешься!? Это ты сам себя так насилуешь, или просто проект с такими требованиями?

anonymous
()
Ответ на: комментарий от DELIRIUM

system()

Это действительно подходит. Но почему-то не работает если имя программы содержит скобки (по крайней мере в винде). Это не большая проблема, но почему так?

user08
() автор топика
Ответ на: комментарий от anonymous

Лолд, святая наивность, загугли whyjohnnycantexec для общего образования что ли.

Например, что будет с сигнал-хендлерами на промежутке между (в)форком и экзеком? Или что будет если в оффтопе нужно пускать процессы из разных тредов и при этом поддерживать XP?

anonymous
()
Ответ на: комментарий от user08

Попробуй как-то так (это из виндового продакшена):

int shell_exec_and_wait(const std::string& cmd) {
#ifdef STATICLIB_WINDOWS
    std::string quoted = "\"" + cmd + "\"";
    std::wstring ws = widen(quoted);
    return _wsystem(ws.c_str());
#else
    return std::system(cmd.c_str());
#endif // STATICLIB_WINDOWS
}

widen где-то в boost.nowide подсмотрен был, он utf8 в utf16 переводит средствами виндовса.

anonymous
()
Ответ на: комментарий от BRE

Ну так дай его ТС.

Стыдно :) Ну и код, как бы, закрытый.

Gvidon ★★★★
()
Ответ на: комментарий от slackwarrior

Мсье знает толк.

:))) Ну это ваще не проблема. Я то могу и в ProgramName_Debug переименовать. Просто интересна причина.

user08
() автор топика
Ответ на: комментарий от user08

Просто интересна причина.

system должен передавать управление системному шеллу, а не напрямую запускать процессы. Видимо виндовый cmd.exe слишком умный.

KennyMinigun ★★★★★
()
Ответ на: комментарий от user08

Экранируй.

Либо каждый спецсимвол отдельно:

ProgramName(Debug).exe -> ProgramName\(Debug\).exe

но множество этих символов и способ экранирования системо-зависимы (в венде, скажем, «\» это нормальный символ и используется в путях, как там экранировать я не помню, возможно через «^»)

Либо бери каждый аргумент в двойные кавычки

ProgramName(Debug).exe > "ProgramName(Debug).exe"
но тут нужно учесть что в аргументе также могут быть двойные кавычки и их, опять таки, нужно экранировать.

На самом деле хотя бы из-за этого system - говно, и лучше написать под #ifdef для windows - CreateProcess или как там его, для всего остального - fork+exec.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от user08

Почему называется Boost если, не имеет отношения к бусту?

Потому что надеется попасть в состав. Boost.log так назывался тоже задолго до включения.

DarkEld3r ★★★★★
()

Существуют ли кроссплатформенные возможности запустить программу из другой программы на C++?

Ты же понимаешь, что кроссплатформенно означает для десктопных приложений запустить под Mac, Win, Lin, а для серверных под Linux и Windows. Большей кроссплатформенности, пока не заплатят отдельно, не требуется. При такой формулировке задача сильно упрощается. Если не найдешь готовое решение, то просто пишешь собственную обертку с реализациями под все 2 или 3 платформы.

anonymous
()
function ownexes(...)
{
ifdef win
win32api.exec(.exe)
ifdef lin
glibc.exec(bin)
....
}

.... ownexes(file)

поработай уже ручками а не копипать из интернета

anonymous
()
Ответ на: комментарий от anonymous

Напиши свое корявое говно, думается это часик примерно, может меньше.

поправил грамматику

rupert ★★★★★
()
Ответ на: комментарий от KennyMinigun

Солярку с БСДой забыл.

Нет не забыл. Солярку ставят либо мегаэнтерпрайзные админы, когда знают что и для чего они делают (их единицы) либо детишки, которые решили выпендриться. БСД - чистый выпендреж (ну, еще нетфликс, который в ядре всерьез копается). То и другое занимает хорошо если пресловутый 1% в Unix-подобных ОС. В любом случае, если люди выбирают экзотику, то пусть сами платят за свой выбор (временем на адаптацию моего программного продукта под свою ОС, либо деньгами тому, кто адаптирует).

Я свое время на поддержку экзотики тратить не стану и никто из разработчиков не станет. Поддержка подразумевает как минимум сборку и тестирование продукта под всеми поддерживаемыми платформами, причем как раз в тот момент, когда разработка очередного функционала завершена и уже хочется закоммитить и перестать об этом думать. И не важно насколько API солярки отличается от Linux, все равно нужно прогнать весь цикл сборки-тестирования (да еще и поддерживать окружение для тестирования). Более того, для тестирования приложения под виндой (все нужные версии) есть appveyor, для Linux и Mac есть travis. Как тестировать под соляркой? Найди любого разработчика и предложи ему нахаляву установить куда-то солярку, регулярно ее обновлять и после каждого коммита гонять под ней тесты... Любой вменяемый разработчик задумается, а зачем это нужно?

Солярка и BSD для фанатов и матерого энтарпрайза, который понимает, что делает. Вот эти люди пусть и занимаются поддержкой софта на этих платформах за свой счет.

anonymous
()
Ответ на: комментарий от KennyMinigun

Солярку с БСДой забыл.

Сейчас вообще тенденция к поддержке одной платформы - Docker. Так что хочешь поддержку солярки - запускай на ней эмуляцию Linux, Docker и в докере контейнер с приложением. Нативный пакет за отдельную плату.

anonymous
()
Ответ на: комментарий от anonymous

Вполне достаточно писать код, соответствующий стандартам POSIX.

annulen ★★★★★
()
Ответ на: комментарий от zamazan4ik

Qt : QProcess

Я люблю Qt но зачем его тащить, если можно в исходниках самого Qt обнаружить тупо ifdef WIN32 и т.д. для каждой ОС, чего и ТС-у желаю

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

не ну, я ж не знаю, что там ТСу надо. Как по мне, если можно, то я бы лично Кьюта чуток притащил. Ну а так то мы все прекрасно знаем, что оно там в середине банально реализовано через ifndef, я думаю и ТС об этом знает и ему не составит особого труда написать самому(ну или извлечь из кьюта самого) эту часть исходника

zamazan4ik ★★
()
Ответ на: комментарий от zamazan4ik

Qt у меня совсем не используется. Заметил вот что. Похоже что system() выполняет программу в том потоке, который её вызвал (по крайней мере в Windows). А мне надо запускать новый процесс.

user08
() автор топика
Ответ на: комментарий от user08

Похоже что system() выполняет программу в том потоке, который её вызвал

API вызова system() предполагает, что функция вернёт код выхода программы. Ну а чтоб получить код выхода логично, что надо подождать пока запускаемый процесс не завершится (что, однако, не препятствует процессу форкнуться и демонизироваться).

KennyMinigun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.