La tua domanda sembrava richiedere una risposta da foresta, e le risposte qui sembrano risposte da albero, quindi ho pensato di darti una risposta da foresta.
Questo è molto raro il modo in cui sono scritti i programmi C. È sempre il modo in cui vengono scritti gli script di shell e talvolta il modo in cui vengono scritti i programmi Python, perl o Ruby.
Le persone in genere scrivono in C per un facile utilizzo delle librerie di sistema e un accesso diretto a basso livello alle chiamate di sistema del sistema operativo, nonché per la velocità. E C è un linguaggio difficile in cui scrivere, quindi se le persone non hanno bisogno di quelle cose, allora non usano C. Inoltre, ci si aspetta che i programmi C abbiano dipendenze solo su librerie condivise e file di configurazione.
Rivolgersi a un processo secondario non è particolarmente veloce e non richiede un accesso controllato e dettagliato a strutture di sistema di basso livello e introduce una dipendenza forse sorprendente da un eseguibile esterno, quindi è raro vedere nei programmi C.
Ci sono alcune preoccupazioni aggiuntive. La sicurezza e la portabilità riguardano le persone menzionate che sono completamente valide. Ovviamente sono ugualmente validi per gli script di shell, ma le persone si aspettano questo tipo di problemi negli script di shell. Ma in genere non ci si aspetta che i programmi C presentino questa classe di problemi di sicurezza, il che lo rende più pericoloso.
Ma, a mio avviso, le maggiori preoccupazioni riguardano il modo in popen
cui interagiranno 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à collegato allo stesso stderr del tuo programma, il che potrebbe causare risultati confusi, e il suo stdin sarà lo stesso del tuo programma, che potrebbe causare altri problemi interessanti. Puoi risolverlo includendo </dev/null 2>/dev/null
la stringa che passi popen
poiché è interpretata dalla shell.
E popen
crea un processo figlio. Se fai qualcosa con la gestione del segnale o i processi di fork, potresti finire per ricevere SIGCHLD
segnali strani . Le tue chiamate a wait
possono interagire stranamente con popen
e forse creare condizioni di gara strane.
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 inserire i meta-charcater della shell nella stringa in cui passi popen
perché quella stringa viene fornita direttamente sh
con sh -c <string from popen as a single argument>
.
Ma non credo che siano il motivo per cui è strano vedere un programma C in uso popen
. Il motivo per cui è strano è che C è in genere un linguaggio di basso livello e popen
non è di basso livello. E perché l'uso di popen
vincoli progettuali pone sul tuo programma perché interagirà stranamente con l'input e l'output standard del tuo programma e renderà difficile fare la tua gestione dei processi o la gestione del segnale. E poiché non ci si aspetta che i programmi C abbiano dipendenze da eseguibili esterni.