Cuando llamo al execvp
, por ejemplo execvp(echo, b)
donde b es una matriz de argumentos para el comando a, ¿cambiará esta matriz más adelante afectará a la llamada execvp realizada anteriormente? Cuando intento llamar a execp (echo, b), termina imprimiendo (nulo) en lugar del contenido dentro de b. ¿Alguien puede señalar por qué y qué debo hacer para pasar los argumentos correctamente?¿Manejando argumentos array de execvp?
Respuesta
Después de llamar al exec()
o uno de sus familiares, su programa original ya no contiene . Eso significa que nada en ese programa puede afectar nada después de la llamada exec()
, ya que nunca se ejecuta. ¿Tal vez no estás construyendo tu matriz de argumentos correctamente? Aquí está un ejemplo rápido de trabajo de execvp()
:
#include <unistd.h>
int main(void)
{
char *execArgs[] = { "echo", "Hello, World!", NULL };
execvp("echo", execArgs);
return 0;
}
Desde el execvp()
man page:
Los
execv()
,execvp()
, yexecvpe()
funciones proporcionan una matriz de punteros a terminada en cero cadenas que representar la lista de argumentos disponible para el nuevo programa. El primer argumento, por convención, debe apuntar al nombre de archivo asociado con el archivo que se está ejecutando. La matriz de punteros debe terminarse con un punteroNULL
.
Un error común es omitir la parte sobre "El primer argumento, por convención, debe apuntar al nombre de archivo asociado con el archivo que se está ejecutando". Esa es la parte que asegura que echo
obtiene "eco" como argv[0]
, de lo que presumiblemente depende.
Recuerde que después de exec
llame su programa se intercambia por uno nuevo. Ya no se está ejecutando, por lo que cualquier código en el mismo proceso después de la llamada exec
es, de hecho, inalcanzable.
¿Estás seguro de que b array termina con NULL? El último elemento debe ser NULL para que el ejecutor funcione correctamente. Además, recuerde configurar su primer parámetro a "echo" también (es argv [0]).
Trate
execlp("echo", "echo", "something", NULL);
Por cierto, execlp
es un poco más cómodo de usar, se puede pasar tantos parámetros como desee.
Así no es como funciona 'execvp()'. –
Por lo que entiendo, execvp toma el comando y la matriz argv. En el momento de la llamada a execvp, tanto el comando como la matriz argv no eran NULL. Sin embargo, cuando se llamó a echo, no pareció tener ningún argumento. – Lucas
Lo sentimos, error tipográfico significaba 'execlp' ... –
- 1. chroot + + execvp fiesta
- 2. Cómo manejar errores execvp (...) después de fork()?
- 3. PHP - Pase array como lista de argumentos de longitud variable
- 4. ¿Está llamando a array() sin argumentos de ningún uso?
- 5. Manejando argumentos de línea de comando de Perl con espacios de un script bash?
- 6. Manejando dos WebException correctamente
- 7. Manejando la muerte de ayudante
- 8. Manejando rutas de archivos multiplataforma
- 9. Spring @ExceptionHandler manejando múltiples tipos de excepciones
- 10. Manejando una excepción nula C#
- 11. Manejando bien con Google Guice
- 12. MultipartForm manejando con la primavera
- 13. Manejando excepciones de tareas de Java ExecutorService
- 14. Manejando diferentes ConnectionStates antes de abrir SqlConnection
- 15. ¿Por qué el parámetro argv para execvp no es const?
- 16. PHP Argumentos de función: array de objetos de una clase específica
- 17. Android string-array a Array
- 18. CoffeeScript “Array()” vs “new Array()”
- 19. Manejando fechas con Asp.Net MVC y KnockoutJS
- 20. Manejando el hilo principal del proceso
- 21. Manejando la tecla "Enter"/"Return" en Chrome
- 22. XPath interpretación por Selenium/WebDriver manejando IE
- 23. Manejando el género gramatical con Gettext
- 24. Manejando una relación belongs_to con backbone.js
- 25. jQuery debería usar múltiples ajaxStart/ajaxStop manejando
- 26. Manejando NSError al leer desde el archivo?
- 27. ¿Es necesario convertir argumentos a Array antes de llamar a apply?
- 28. ¿Diferencias significativas en Array vs Array List?
- 29. Diferencia entre array [n] y array []?
- 30. Convertir Numpy Array a OpenCV Array
En lugar de usar echo, usé otro programa que esencialmente imprime todo en su matriz argv. Siempre asumí que argv [0] sería el nombre del comando en sí (el primer parámetro de execv), pero en este caso después de llamar a execv, argv [0] no lo era. Más bien fue el segundo param de la execv. ¿Puedes aclarar esto? – Lucas
Bueno, cuando pasó la lista de argumentos a 'execv', ¿configuró' argv [0] 'con el nombre del comando? La matriz que pasa como el segundo argumento 'execvp' * se convierte en *' argv' en el nuevo programa, por lo que debe configurarlo de la manera que cabría esperar. –
Este código rompe const correctness. Prefiero escribir const char * args [] = {...}; ¡pero el prototipo para execvp requiere que las cadenas en args sean escribibles! – user877329