Tu pregunta parecía requerir una respuesta de bosque, y las respuestas aquí parecen respuestas de árbol, así que pensé que te daría una respuesta de bosque.
Esto es muy raro en cómo 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 de Python, Perl o Ruby.
La gente normalmente escribe en C para facilitar el uso de las bibliotecas del sistema y el acceso directo de bajo nivel a las llamadas del 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 tengan dependencias de bibliotecas compartidas y archivos de configuración.
Desglosar 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 para ver en los programas de 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 este tipo de problemas en los scripts de shell. Pero normalmente no se espera que los programas de C tengan esta clase de problemas de seguridad, lo que los hace más peligrosos.
Pero, en mi opinión, las mayores preocupaciones tienen que ver con la forma en que popen
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' se conectará 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. Puedes resolverlo incluyendo </dev/null 2>/dev/null
en la cadena que pasas a popen
desde que es interpretado por el shell.
Y popen
crea un proceso secundario. Si usted mismo hace algo con el manejo de la señal o los procesos de bifurcación, puede terminar recibiendo señales impares SIGCHLD
. Sus llamadas a wait
pueden interactuar de manera extraña con popen
y posiblemente crear condiciones de carrera extrañas.
Las preocupaciones de seguridad y portabilidad están ahí, por supuesto. Como son para los 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 los metacaracteres de shell en la cadena que pasa a popen
porque esa cadena se asigna directamente a 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 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 un bajo nivel. Y debido a que el uso de popen
coloca restricciones de diseño en su programa, ya que interactuará de manera extraña con la entrada y salida estándar de su programa y le resultará difícil realizar 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.