¿Por qué la familia de funciones exec() no ejecuta el código después de exec()?

3 minutos de lectura

la página del manual dice que “La familia de funciones exec() reemplaza la imagen del proceso actual con una nueva imagen del proceso”. pero no entiendo muy bien el significado de “reemplaza la imagen del proceso actual con una nueva imagen del proceso”. Por ejemplo, si exec tiene éxito, no se alcanzará a perror

execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");

  • Creo que significa que cuando se llama a exec, su programa finaliza y se ejecuta el nuevo

    – Mike — Ya no estoy aquí

    2 de octubre de 2015 a las 2:20

¿Por que la familia de funciones exec no ejecuta el
paxdiablo

Correcto. Si el exec obras, el perror no será llamado, simplemente porque la llamada a perror ya no existe.

Encuentro que a veces es más fácil educar a los recién llegados a estos conceptos, pensar en el modelo de ejecución de UNIX como compuesto por procesos, programas y instancias del programa.

Los programas son archivos ejecutables como /bin/ls o /sbin/fdisk (Tenga en cuenta que esto no incluye cosas como bash o secuencias de comandos de Python ya que, en ese caso, el ejecutable real sería el bash o python intérprete, no el guión).

Las instancias de programa son programas que se han cargado en la memoria y básicamente se están ejecutando. Si bien solo hay un programa como /bin/lspuede haber varias instancias de él ejecutándose en un momento dado si, por ejemplo, tanto usted como yo lo ejecutamos al mismo tiempo.

Esa frase “cargado en la memoria” es donde los procesos entran en escena. Los procesos son simplemente “contenedores” en los que se pueden ejecutar instancias de programas.

Entonces, cuando tu fork un proceso, terminas con dos distinto pero cada uno de ellos sigue ejecutando instancias distintas del mismo programa. los fork La llamada a menudo se conoce como aquella a la que llama un proceso pero de la que regresan dos procesos.

Igualmente, exec no tendrá un efecto en el proceso en sí, pero voluntad descartar la instancia del programa actual en ese proceso y comenzar una nueva instancia del programa solicitado.

Este descarte en un exitoso exec llamada es lo que dicta que el código que le sigue (perror en este caso) no serán llamados.

Significa que su proceso actual se convierte en el nuevo proceso en lugar de lo que era. Dejas de hacer lo que estás haciendo y empiezas a hacer, a ser realmente, otra cosa en su lugar, para nunca volver a ser lo que ese proceso fue una vez.

Sin embargo, en lugar de iniciar un proceso completamente nuevo, su pid y entorno actuales se convierten en el nuevo proceso. Eso le permite configurar las cosas de la forma en que el nuevo proceso lo necesitará antes de hacer el exec.

Estás en lo correcto. perror no será llamado a menos que falle el execl. los exec Las funciones son los medios para iniciar nuevos procesos en un sistema operativo compatible con POSIX (generalmente combinado con un fork llamada). Tal vez un ejemplo ayude. Suponga que su programa, llámelo programX, se está ejecutando. Luego llama a una de las funciones ejecutivas como la que tiene arriba. programX ya no existirá como un proceso en ejecución. En su lugar, se ejecutará ls. Tendrá exactamente el mismo PID que programX, pero de lo contrario será un proceso completamente nuevo.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad