traduccion jeff exchange english atwood c system popen

jeff - stack overflow python



¿Cuál es la diferencia entre popen() y system() en C? (2)

Quiero ejecutar un binario dentro de mi código C. ¿Qué es mejor ejecutar con? popen() o system()

EDITAR : traté de usar el system , pero el proceso de ejecución parece atascarse al final y no vuelve a mi código.

¿Alguna sugerencia sobre qué hacer?

Gracias


Use popen si desea ejecutar un comando de shell y desea que el proceso padre pueda hablar con el hijo. (Engancha la entrada o salida del niño a la secuencia que regresa). De lo contrario, prefiera la familia de funciones exec (probablemente junto con la fork ); los procesos ejecutados heredan la mayoría de los descriptores de archivos abiertos (incluidos stdin, stdout y stderr), por lo que puede enlazar la entrada y la salida a lo que quiera ... además, hay menos implicaciones de seguridad.

Por lo general, es mejor evitar el sistema a menos que tenga que ejecutar comandos de shell. Genera un shell para ejecutar el comando, y el shell puede analizar el comando como desee. En particular, ciertas variables de entorno (como $IFS y / o $PATH ) pueden modificarse de tal manera que los padres ejecuten programas a los que nunca se propuso. Aunque popen parece hacer lo mismo, al menos proporciona una funcionalidad que hace que valga la pena en el caso general.


popen() le da control sobre las secuencias de archivos de entrada o salida del proceso. system() no lo hace. Si no necesita acceder a la E / S del proceso, puede usar system() por simplicidad.

system() está en C89 y C99; popen() es solo Posix (aunque la API de Windows también tiene uno).

Ambas funciones invocan alguna forma de shell para ejecutar el comando (por ejemplo, /bin/sh en Linux, y probablemente cmd.exe en Windows). Si desea ejecutar un archivo ejecutable directamente y está en Posix, también puede consultar la familia exec* de funciones en conjunción con fork() (dado que exec() reemplaza el proceso actual).