Su pregunta parecía requerir una respuesta de bosque, y las respuestas aquí parecen respuestas de árbol, así que pensé en darle una respuesta de bosque.
Raramente es así como se escriben los programas en C. Siempre es cómo se escriben los scripts de shell y, a veces, cómo se escriben los programas Python, perl o Ruby.
Las personas suelen escribir en C para facilitar el uso de las bibliotecas del sistema y el acceso directo de bajo nivel a las llamadas al sistema operativo, así como para la velocidad. Y C es un lenguaje difícil de escribir, por lo que si las personas no necesitan esas cosas, entonces no usan C. También se espera que los programas C solo dependan de bibliotecas compartidas y archivos de configuración.
Desplazarse a un subproceso no es particularmente rápido, y no requiere un acceso controlado y detallado a las instalaciones del sistema de bajo nivel, e introduce una dependencia posiblemente sorprendente en un ejecutable externo, por lo que es poco común ver en los programas C.
Hay algunas preocupaciones adicionales. Las preocupaciones de seguridad y portabilidad que mencionan las personas son completamente válidas. Por supuesto, son igualmente válidos para los scripts de shell, pero la gente espera ese tipo de problemas en los scripts de shell. Pero, por lo general, no se espera que los programas C tengan este tipo de preocupación de seguridad, lo que lo hace más peligroso.
Pero, en mi opinión, las mayores preocupaciones tienen que ver con la forma en popen
que interactuará con el resto de su programa. popen
tiene que crear un proceso hijo, leer su salida y recopilar su estado de salida. Mientras tanto, el proceso 'stderr estará conectado al mismo stderr que su programa, lo que puede causar resultados confusos, y su stdin será el mismo que su programa, lo que podría causar otros problemas interesantes. Puede resolver eso al incluir </dev/null 2>/dev/null
en la cadena a la que pasa, popen
ya que es interpretada por el shell.
Y popen
crea un proceso hijo. Si hace algo con el manejo de la señal o los procesos de bifurcación, puede terminar recibiendo SIGCHLD
señales extrañas . Sus llamadas a wait
pueden interactuar de manera extraña popen
y posiblemente crear condiciones de carrera extrañas.
Las preocupaciones de seguridad y portabilidad están ahí, por supuesto. Como son para scripts de shell o cualquier cosa que inicie otros ejecutables en el sistema. Y debe tener cuidado de que las personas que usan su programa no puedan obtener metacaracteres de shell en la cadena que ingresa popen
porque esa cadena se le da directamente sh
con sh -c <string from popen as a single argument>
.
Pero no creo que sea por eso que es extraño ver un programa en C usando popen
. La razón por la que es extraño es porque C es típicamente un lenguaje de bajo nivel y popen
no es de bajo nivel. Y debido al uso de popen
restricciones de diseño de lugares en su programa porque interactuará de manera extraña con la entrada y salida estándar de su programa y hará que sea difícil hacer su propia gestión de procesos o manejo de señales. Y debido a que normalmente no se espera que los programas C tengan dependencias de ejecutables externos.