Ваш вопрос, казалось, требовал лесного ответа, а ответы здесь кажутся древовидными, поэтому я решил дать вам лесной ответ.
Это очень редко, как пишутся программы на Си. Это всегда, как пишутся сценарии оболочки, а иногда и как программы на Python, Perl или Ruby.
Люди обычно пишут на C для простого использования системных библиотек и прямого низкоуровневого доступа к системным вызовам ОС, а также для скорости. А C - сложный язык для написания, поэтому, если людям не нужны эти вещи, они не используют C. Кроме того, ожидается, что программы на C обычно зависят только от общих библиотек и файлов конфигурации.
Выделение подпроцесса не особенно быстрое и не требует детального и контролируемого доступа к низкоуровневым системным средствам, а также представляет собой неожиданную зависимость от внешнего исполняемого файла, поэтому его редко можно увидеть в C программах.
Есть некоторые дополнительные проблемы. Вопросы безопасности и мобильности, о которых упоминают люди, полностью действительны. Конечно, они одинаково действительны для сценариев оболочки, но люди ожидают такого рода проблем в сценариях оболочки. Но от программ на C обычно не ожидается такой класс безопасности, что делает его более опасным.
Но, на мой взгляд, самые большие проблемы связаны с тем, как popen
будет взаимодействовать с остальной частью вашей программы. popen
должен создать дочерний процесс, прочитать его выходные данные и получить статус выхода. Между тем, stderr этого процесса будет подключен к тому же stderr, что и ваша программа, что может привести к сбивающему с толку выводу, а его stdin будет таким же, как ваша программа, что может вызвать другие интересные проблемы. Вы можете решить эту проблему, включив </dev/null 2>/dev/null
в popen
нее передаваемую строку, поскольку она интерпретируется оболочкой.
И popen
создает дочерний процесс. Если вы что-то делаете с процессами обработки сигналов или разветвления самостоятельно, вы можете получить странные SIGCHLD
сигналы. Ваши призывы wait
могут странным образом взаимодействовать popen
и, возможно, создавать странные условия гонки.
Проблемы безопасности и переносимости, конечно, есть. Как и для сценариев оболочки или всего, что запускает другие исполняемые файлы в системе. И вы должны быть осторожны, чтобы люди, использующие вашу программу, не могли получить метасимволы оболочки в строку, в которую вы передаете, popen
потому что эта строка передается непосредственно с sh
помощью sh -c <string from popen as a single argument>
.
Но я не думаю, что по этой причине странно видеть использование программы на Си popen
. Причина в том, что это странно, потому что C, как правило, язык низкого уровня, а popen
не низкого уровня. И потому что использование popen
накладывает конструктивные ограничения на вашу программу, потому что она будет странным образом взаимодействовать со стандартным вводом и выводом вашей программы и затруднит управление вашим собственным процессом или обработкой сигналов. А поскольку программы на Си, как правило, не должны зависеть от внешних исполняемых файлов.