LINUX.ORG.RU

Поиск легковесной C++ библиотеки для запуска дочерних процессов в Linux-е

 


2

4

В последний раз, когда довелось столкнуться с задачей запуска дочерних процессов в Linux-е, то воспользовался вот этой штукой: https://github.com/skystrife/procxx

Но она уже более трех лет не развивается. Поэтому возник вопрос, а не появилось ли за это время что-то более свежее и живое?

Если кто-то знает хорошие альтернативы procxx, то поделитесь ссылками плиз.

PS. Ищется небольшая C++11 библиотека, без большого количества зависимостей, поэтому Qt, Boost-ы, ACE и Poco не рассматриваются. В принципе, можно и для более свежих плюсовых стандартов, хотя пока что есть надобность ограничиться C++11.

★★★★★

Но она уже более трех лет не развивается.

А что ты ещё хочешь от узкоспециализированной обёртки на меньше чем 1k строк кода вместе с комментариями? Что бы она выросла до размеров Qt/Poco/итп?

Она на столько простая, что тебе должно быть под силу при необходимости её форкнуть, подправить и отправить пулл-реквест.

Так что не вижу никаких проблем использовать эту библиотеку и дальше.

AlexVR ★★★★★
()

я конечно извиняюсь, но чем не устраивают банальные system, popen и т.п.?

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

А что ты ещё хочешь от узкоспециализированной обёртки на меньше чем 1k строк кода вместе с комментариями? Что бы она выросла до размеров Qt/Poco/итп?

А, как же, спрятать все за 4 уровнями namespace’ов как годовые кольца на срезе дерева? Со временем сложность должна только расти.

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

я конечно извиняюсь, но чем не устраивают банальные system, popen и т.п.?

Ленью писать лишнее? Особенно когда можно так:

// construct a child process that runs `cat`
procxx::process cat{"cat"};

// construct a child process that runs `wc -c`
procxx::process wc{"wc", "-c"};

// set up the pipeline and execute the child processes
(cat | wc).exec();

// write "hello world" to the standard input of the cat child process
cat << "hello world";

// close the write end (stdin) of the cat child
cat.close(procxx::pipe_t::write_end());

// read from the `wc -c` process's stdout, line by line
std::string line;
while (std::getline(wc.output(), line))
    std::cout << line << std::endl;
AlexVR ★★★★★
()
Ответ на: комментарий от legolegs

Как минимум возможностью запихнуть данные в stdin и извлечь из stdout. System же вроде не даёт доступа к этому.

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

можно использовать freopen, например

anonymous
()

более трех лет не развивается

Вот никогда не понимал в чем тут проблема. Другое дело если она поломанная и не работает.

sergej ★★★★★
()

Лол :-) цепепе с своём амплуа :-) Что же это за язык такой, в котором в стандартной либе нет такой элемнарщины, как запуск процессов ОС :-) В 2020 году :-) Наверное, обдумывается сверх супер универсальный гибкий расширяемый через тонны трэитсов и центнеры шаблонов в 10 уровневых неймспейсах (detail не забыть, конечно, это же признак труъ цепепе кода), как принято говорить, инструмент :-) Ещё лет 10 и дизайн будет готов :-) Нет, хороший язык цепепе :-) Все решения должны сначала быть обдуманы лет 10-20, чтобы были универсальными :-) Только потом можно внедрять :-)

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

Лол :-) цепепе с своём амплуа :-) Что же это за язык такой, в котором в стандартной либе нет такой элемнарщины, как запуск процессов ОС :-) В 2020 году :-) Наверное, обдумывается сверх супер универсальный гибкий расширяемый через тонны трэитсов и центнеры шаблонов в 10 уровневых неймспейсах (detail не забыть, конечно, это же признак труъ цепепе кода), как принято говорить, инструмент :-) Ещё лет 10 и дизайн будет готов :-) Нет, хороший язык цепепе :-) Все решения должны сначала быть обдуманы лет 10-20, чтобы были универсальными :-) Только потом можно внедрять :-)

@alienclaster, ты?

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

Лол :-) цепепе с своём амплуа :-) Что же это за язык такой, в котором в стандартной либе нет такой элемнарщины, как запуск процессов ОС :-) В 2020 году :-) Наверное, обдумывается сверх супер универсальный гибкий расширяемый через тонны трэитсов и центнеры шаблонов в 10 уровневых неймспейсах (detail не забыть, конечно, это же признак труъ цепепе кода), как принято говорить, инструмент :-) Ещё лет 10 и дизайн будет готов :-) Нет, хороший язык цепепе :-) Все решения должны сначала быть обдуманы лет 10-20, чтобы были универсальными :-) Только потом можно внедрять :-)

Человек-смайлик, я по тебе скучал 🤠 Правда-правда 🌚

anonymous
()

Сделай сам/выложи на гитхаб. Когда мне нужно была такая библиотека, я сделал только первый пункт.

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

Как бэ толку от того, что он сделает форк(хрен с ним, позикс везде) - вообще нет. Там поболее надо

DllMain
()

А зачем для этого нужна библиотека?

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

Типа ссыкотно закладывать либу на будущее, или левые мысли «а может все уползли на более крутую либу а я в танке»

I-Love-Microsoft ★★★★★
()

Т.е. тебе лень три-четыре функции вызывать и ты хочешь это обернуть в библиотеку?

Ну, трындец…

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

В копилку

Флакон, я думал ты кинешь ссылку на очередной ХеллоВорлд на Расте, но ты меня разочаровал :(

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

И в этом вся жизнь, чреда очарований и разочарований.

abcq ★★
()

В общем, если кому-то интересно, то получилось следующее. Времени разбираться с другими альтернативами procxx особо не было, а беглый просмотр некоторых из них навел на подозрение, что качество кода там так себе. Поэтому остался на procxx.

Но в процессе очередного использования procxx было выявлено несколько «фатальных» недостатков, которые были наспех пофикшены в моем форке procxx. А т.к. с выявлеными проблемами могли бы столкнуться и другие пользователи procxx, то появилось желание сделать эти правки доступными.

К сожалению, библиотека procxx выглядит окончательно заброшенной своим автором. Поэтому я решил не отсылать PR в procxx, т.к. его вряд ли приняли бы, а сделал форк под другим именем:

https://github.com/eao197/procyy

Этот форк лежит, в общем-то в том же виде, в котором и procxx. Никаких тестов, продвинутых примеров, проектных файлов для CMake или чего-нибудь еще. Как взял, так и оставил :)

Планов по какому-то дальнейшему развитию нет. Если в дальнейшем потребуется какая-то дополнительная функциональность, то буду добавлять по мере надобности. Если у кого-то будут проблемы с procyy, открывайте issue, по возможности постараюсь разобраться и помочь.

Нет и планов добавить procyy в conan, vcpkg, hunter или какой-нибудь другой менеджер зависимостей. Лично мне это не нужно, а если кому-то нужно, тот пусть и берет на себя все эти заботы. Простите.

PS. Кидаться в меня помидорами по поводу качества кода нет смысла, программист из меня так себе. Получилось как получилось. Конструктивные соображения по поводу улучшения кода продуктивнее оформлять в виде issues.

eao197 ★★★★★
() автор топика
22 июня 2020 г.
Ответ на: комментарий от eao197

добрый день

скачал вашу бибилотеку, на посмотреть.
встречный вопрос: в ней есть возможность «захвата выхлопа/эхо работы скрипта»?

спасибо

п.с. возможно, пригодится :о)
_clang.sh

#!/bin/sh
export COMP=CLANG; _build.sh
_gcc.sh
#!/bin/sh
export COMP=GCC; _build.sh
_build.sh
#!/bin/sh
set -e; clear

COMP=${COMP:-GCC}
 LST="sample sample_no_pipe2 sample_post_fork_hook"

case $COMP in
GCC   ) BUILD="g++     -std=c++11 -Iinc -Wall -Wextra -o" ;;
CLANG ) BUILD="clang++ -std=c++11 -Iinc -Weverything -Wno-c++98-compat -Wno-padded -Wno-weak-vtables -o" ;;
esac
echo "COMP = $COMP"

for APP in $LST; do
echo "APP  = $APP"
$BUILD $APP $APP.cpp
done

echo -e "\n###\nOK\n###\n"; beep

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

встречный вопрос: в ней есть возможность «захвата выхлопа/эхо работы скрипта»?

Не понял вопрос.

Вы создаете экземпляр procyy::process, вызываете exec у него. Затем посредством output и/или error получаете доступ к iostream, откуда можете читать stdout/stderr запущенного процесса.

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