Cuál es la diferencia entre usar system() para ejecutar un binario y usar la combinación de fork/execvp.Diferencia entre el uso de fork/execvp y la llamada al sistema
Existe alguna diferencia de seguridad/portabilidad/rendimiento.
Cuál es la diferencia entre usar system() para ejecutar un binario y usar la combinación de fork/execvp.Diferencia entre el uso de fork/execvp y la llamada al sistema
Existe alguna diferencia de seguridad/portabilidad/rendimiento.
El sistema también utiliza una combinación fork
/exec
.... Si lo hace fork
/exec
usted mismo puede ejecutar en paralelo a su proceso en ejecución, mientras que system
está bloqueando (incluye el wait
). También system
ejecuta el comando no directo, pero a través de un shell (que causa problemas con el bit setuid) y system
bloquea/ignora ciertas señales (SIGINT, SIGCHILD, SIGQUIT).
Sí, system()
ejecuta el comando a través de un shell, mientras que exec()
ejecuta el comando directamente. Por supuesto, la introducción de un shell se abre para los errores y exploits.
Editar: por supuesto, the man page proporciona más detalles.
sistema() funciona en Windows pero fork() no.
A menos que utilice una capa de compatibilidad como Cygwin, pero incluso entonces una horquilla puede ser muy costosa.
la pregunta está etiquetada como linux/unix, por lo que una respuesta de Windows no es tan útil ... –
@Nathan, La pregunta menciona las diferencias de portabilidad, que es esta. – finnw
Tengo una pregunta sobre la cuestión de los gastos, ¿Cómo es el tenedor más caro que el sistema. El sistema también bifurca un proceso, sino que bifurca dos procesos. – foo
También ha Popen(), que es como el sistema(), pero permite leer la salida del niño y proporcionar información
system()
se fork()
/exec()
la cáscara, y luego Shell fork()
/exec()
el programa que desee lanzamiento.
Así system()
es dos veces tan pesado como fork()
/exec()
"la introducción de una concha se abre para bugs y exploits" - Sólo si se permite que una persona escriba los comandos. Si su aplicación genera el texto del comando de shell, no hay posibilidad de un exploit. –
Una posibilidad es si el usuario cambia algunas variables de shell antes de que se ejecute su código. Existe la posibilidad de explotar, pero no estoy seguro de qué tan genérico es. – foo
También tiene trucos path/linker. [Rompiendo los enlaces: Explotando el enlazador] (http://www.nth-dimension.org.uk/pub/BTL.pdf). – jww