Necesito ejecutar un comando de Unix con diferentes argumentos en un bucle. Ahora me pregunto si debería usar execvp(), pasar el cmd y los argumentos, o usar el sistema, construyendo una cadena que consta de cmd + args?Cuándo usar el sistema() y cuándo usar execv *()?
Respuesta
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
}
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
.
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.
- 1. Cuándo usar undef_method, y cuándo usar remove_method?
- 2. Cuándo usar Pepino y cuándo usar RSpec?
- 3. cuándo usar Tarea y cuándo usar Subproceso?
- 4. Cuándo usar categorías y cuándo usar subclases?
- 5. ¿Cuándo usar == y cuándo usarlo?
- 6. Cuándo usar Class.isInstance() y cuándo usar el operador instanceof?
- 7. Cuándo deberíamos usar mutex y cuándo deberíamos usar el semáforo
- 8. ¿Cuándo debe usar JCR y cuándo debe usar JPA/RDBMS?
- 9. Cuándo usar Ruby vs Cuándo usar PHP
- 10. Cuándo usar `zipmap` y cuándo` map vector`?
- 11. Cuándo usar Restringir y cuándo no a
- 12. Cuándo usar OSGi EventAdmin y cuándo no?
- 13. ¿Cuándo debería usar Silverlight y cuándo XNA?
- 14. ¿Cuándo debería usar TCP_NODELAY y cuándo TCP_CORK?
- 15. Cuándo usar un módulo y cuándo usar una clase
- 16. Cuándo usar componentes y cuándo usar extensiones en Yii?
- 17. Cuándo usar vectores y cuándo usar matrices en C++?
- 18. ¿Cuándo debería usar require() y cuándo usar define()?
- 19. Cuándo usar dup, y cuándo usar clon en Ruby?
- 20. cuándo deberíamos usar instanceof y cuándo no
- 21. Cuándo usar .mdf y cuándo .sdf?
- 22. Cuándo usar GWT y cuándo no
- 23. Cuándo usar Requirejs y cuándo usar javascript incluido?
- 24. Cuándo usar assert() y cuándo usar try catch?
- 25. Cuándo usar y cuándo no usar Try Catch Finally
- 26. ¿Cuándo usar el rendimiento?
- 27. ¿Cuándo usar el cierre?
- 28. Cuándo usar, no usar, OneToOne y ManyToOne
- 29. Cuándo usar el método GetXXX() y cuándo una propiedad Getter
- 30. BitmapCache? ¿Cuándo y cómo usar?
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
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
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