Sua pergunta pareceu exigir uma resposta da floresta, e as respostas aqui parecem respostas de árvore, então pensei em lhe dar uma resposta da floresta.
Isso é muito raro como os programas em C são escritos. É sempre assim que os scripts shell são escritos e, às vezes, como os programas Python, perl ou Ruby são escritos.
As pessoas normalmente escrevem em C para facilitar o uso das bibliotecas do sistema e direcionar o acesso de baixo nível às chamadas do sistema operacional, assim como para a velocidade. E C é uma linguagem difícil de escrever, portanto, se as pessoas não precisam dessas coisas, então elas não usam C. Também se espera que os programas em C dependam apenas de bibliotecas compartilhadas e arquivos de configuração.
O envio para um subprocesso não é particularmente rápido e não exige acesso controlado e de baixa granularidade a recursos de sistema de baixo nível, e apresenta uma dependência possivelmente surpreendente em um executável externo, portanto, incomum para ver em programas C.
Existem algumas preocupações adicionais. As preocupações de segurança e portabilidade mencionadas são completamente válidas. Eles são igualmente válidos para shell scripts, é claro, mas as pessoas estão esperando esses tipos de problemas em scripts de shell. Mas normalmente não se espera que os programas em C tenham essa classe de preocupação com a segurança, o que a torna mais perigosa.
Mas, na minha opinião, as maiores preocupações têm a ver com a maneira como o popen
irá interagir com o resto do seu programa. popen
tem que criar um processo filho, ler sua saída e coletar seu status de saída. Enquanto isso, o stderr desse processo será conectado ao mesmo stderr do seu programa, o que pode causar uma saída confusa, e seu stdin será o mesmo do seu programa, o que pode causar outros problemas interessantes. Você pode resolver isso incluindo </dev/null 2>/dev/null
na string que você passa para popen
desde que seja interpretada pelo shell.
E popen
cria um processo filho. Se você fizer qualquer coisa com processos de manuseio de sinalização ou bifurcação você pode acabar recebendo sinais estranhos SIGCHLD
. Suas chamadas para wait
podem interagir de forma estranha com popen
e possivelmente criar condições de corrida estranhas.
As preocupações com segurança e portabilidade estão lá, é claro. Como são para scripts de shell ou qualquer coisa que inicie outros executáveis no sistema. E você precisa ter cuidado para que as pessoas que usam seu programa não consigam obter meta-charcaters do shell na string que você passa para popen
porque essa string é fornecida diretamente para sh
with sh -c <string from popen as a single argument>
.
Mas eu não acho que seja por isso que é estranho ver um programa em C usando popen
. A razão é estranho porque C é tipicamente uma linguagem de baixo nível, e popen
não é baixo. E como o uso de popen
coloca restrições de projeto em seu programa, pois ele interage de maneira estranha com a entrada e a saída padrão do seu programa e dificulta o gerenciamento de processos ou a manipulação de sinais. E como os programas em C geralmente não devem ter dependências em executáveis externos.