Estoy intentando rastrear un bloqueo muy extraño. Lo que es tan extraño al respecto es una solución que alguien descubrió y que no puedo explicar.cómo puede un ejecutivo cambiar el comportamiento del programa ejecutado
La solución es este pequeño programa que me referiré como 'corredor':
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
Como se puede ver, todo esto hace es utilizar el programa para reemplazar execvp
sí con un programa diferente.
El programa se bloquea cuando se invoca directamente desde la línea de comandos:
/path/to/prog args # this crashes
pero funciona bien cuando se invoca indirectamente a través de mi corredor de cuña:
/path/to/runner /path/to/prog args # works successfully
Para la vida de mí, Puedo descubrir cómo tener un ejecutivo adicional puede cambiar el comportamiento del programa que se está ejecutando (como puede ver, el programa no cambia el entorno).
Algunos antecedentes sobre el accidente. El bloqueo en sí está sucediendo en el tiempo de ejecución de C++. En concreto, cuando el programa hace un throw
, la versión estrellarse cree incorrectamente que no hay capturas juego (aunque hay) y llama terminate
. Cuando invoco el programa a través de runner, la excepción se captura correctamente.
Mi pregunta es alguna idea de por qué el exec adicional cambia el comportamiento del programa ejecutado?
No sé: Pero ¿Cambia la execvp el directorio de trabajo? ¿Qué argumentos estás pasando? –
@MartinYork - AFAIK, 'execvp' nunca cambia el directorio de trabajo (que requiere una llamada a' chdir' y el corredor no hace eso). Los argumentos específicos son irrelevantes; el comportamiento descrito es independiente de los argumentos específicos pasados al programa. –
¿Hace lo mismo si usa 'execv()' en lugar de 'execvp()'? – caf