La tua domanda sembrava richiedere una risposta alla foresta, e le risposte qui sembrano risposte ad albero, quindi ho pensato di darti una risposta alla foresta.
Questo è molto raramente come vengono scritti i programmi C. È sempre come vengono scritti gli script della shell, e talvolta come vengono scritti i programmi Python, perl o Ruby.
Le persone tipicamente scrivono in C per un facile utilizzo delle librerie di sistema e dirigono l'accesso a basso livello alle chiamate del sistema operativo e alla velocità. E C è un linguaggio difficile da scrivere, quindi se le persone non hanno bisogno di queste cose, allora non usano C. Anche i programmi C in genere dovrebbero avere solo dipendenze su librerie condivise e file di configurazione.
L'eliminazione di un sottoprocesso non è particolarmente veloce e non richiede un accesso preciso e controllato a funzioni di sistema di basso livello e introduce una dipendenza potenzialmente sorprendente su un eseguibile esterno, quindi è non comune da vedere nei programmi C.
Ci sono alcune preoccupazioni aggiuntive. La sicurezza e la portabilità riguardano le persone menzionate sono completamente valide. Sono ugualmente validi per gli script di shell, ovviamente, ma le persone si aspettano questo tipo di problemi negli script di shell. Di solito, i programmi C non hanno questa preoccupazione per la sicurezza, il che lo rende più pericoloso.
Ma, a mio parere, le maggiori preoccupazioni riguardano il modo in cui popen
interagirà con il resto del programma. popen
deve creare un processo figlio, leggere il suo output e raccogliere il suo stato di uscita. Nel frattempo, quel processo 'stderr sarà connesso allo stderr stesso del tuo programma, che potrebbe causare un output confuso, e il suo stdin sarà lo stesso del tuo programma, il che potrebbe causare altri problemi interessanti. Puoi risolverlo includendo </dev/null 2>/dev/null
nella stringa che passi a popen
poiché è interpretata dalla shell.
E popen
crea un processo figlio. Se fai qualcosa con la gestione del segnale o processi di forking tu stesso potresti finire per ottenere strani segnali di SIGCHLD
. Le tue chiamate a wait
potrebbero interagire in modo strano con popen
e possibilmente creare strane condizioni di gara.
I problemi di sicurezza e portabilità ci sono ovviamente. Come lo sono per gli script di shell o qualsiasi cosa che avvii altri eseguibili sul sistema. E devi stare attento che le persone che usano il tuo programma non sono in grado di ottenere i meta-caratteri della shell nella stringa che passi in popen
perché quella stringa è data direttamente a sh
con sh -c <string from popen as a single argument>
.
Ma non penso che siano il motivo per cui è strano vedere un programma in C che usa popen
. Il motivo per cui è strano è perché C è in genere un linguaggio di basso livello e popen
non è di basso livello. E poiché l'utilizzo di popen
pone vincoli di progettazione sul tuo programma perché interagirà in modo strano con gli input e output standard del tuo programma e renderà difficile la tua gestione dei processi o la gestione dei segnali. E poiché in genere non ci si aspetta che i programmi C abbiano dipendenze da file eseguibili esterni.