2010-02-18 18 views

Respuesta

10

Bueno, las otras respuestas son en su mayoría correcto.

Sistema, aunque no solo fork s y luego exec s, no hace exec su proceso, ejecuta el shell por defecto, pasando su programa como argumento.

Por lo tanto, a menos que realmente desea una cáscara (para el análisis de parámetros y similares) es mucho más eficiente para hacer algo como:

int i = fork(); 
if (i != 0) { 
    exec*(...); // whichever flavor fits the bill 
} else { 
    wait(); // or something more sophisticated 
} 
7

La familia de funciones exec reemplazará el proceso actual por uno nuevo, mientras que system bifurcará el nuevo proceso y luego esperará a que finalice. Cuál usar depende de lo que quieras.

Dado que está haciendo esto en un bucle, supongo que no desea reemplazar el proceso original. Por lo tanto, sugiero que trates de ir con system.

+1

sistema también somete la línea de comando analizador de la línea, lo que podría abrir agujeros para ataques de inyección. – falstro

+0

Busqué algunos tutoriales sobre esto en la web y la mayoría de los ejemplos tenedor() ed un nuevo proceso y luego reemplazó el tenedor con execvp(). Después de eso, el proceso principal esperó a que el proceso hijo finalizara. ¿Esto es básicamente lo que hace el sistema()? – helpermethod

+1

Sí, eso es básicamente lo que 'system()' hace. Llamar a 'system()' también ejecuta el shell predeterminado y pasa su programa como argumento, lo que creará un poco más de sobrecarga. – jschmier

5

Utilizaría execvp solo si no puedo lograr lo que quiero con el sistema. Tenga en cuenta que para obtener el equivalente del sistema, necesita execvp, fork y algo de manejo de señal también.

Cuestiones relacionadas