En informática , `exec` es una funcionalidad del sistema operativo que ejecuta un archivo ejecutable dentro del contexto de un proceso ya existente , reemplazando al ejecutable anterior. Esta acción también se conoce como superposición . Es especialmente importante en sistemas tipo Unix , aunque también se encuentra en otros. Como no se crea ningún proceso nuevo, el identificador de proceso (PID) no cambia, pero el código máquina , los datos , el montón y la pila del proceso se reemplazan por los del nuevo programa.
La exec()llamada o alguna variante está disponible para muchos lenguajes de programación, incluidos los lenguajes compilados y algunos lenguajes de scripting . En los intérpretes de comandos , el execcomando integrado reemplaza el proceso del shell con el programa especificado. [ 1 ]
Nomenclatura
Las interfaces execy sus implementaciones varían. Dependiendo del lenguaje de programación, puede ser accesible a través de una o más funciones , y dependiendo del sistema operativo, puede representarse con una o más llamadas al sistema . Por esta razón, execa veces se describe como una colección de funciones .
En C , no existe una única exec()función simple.
Los lenguajes de programación de alto nivel suelen proporcionar una llamada denominada exec().
En sistemas POSIX, otros sistemas tipo Unix y otros sistemas multitarea.
prototipos del lenguaje C
El estándar POSIX declara una familia de execfunciones en el archivo de cabecera unistd.h . Las mismas funciones se declaran en process.h para DOS (véase más abajo ), OS/2 y Microsoft Windows .
int execl ( char const * path , char const * arg0 , ...); int execle ( char const * path , char const * arg0 , ..., char const * envp []); int execlp ( char const * file , char const * arg0 , ...); int execv ( char const * path , char const * argv []); int execve ( char const * path , char const * argv [], char const * envp []); int execvp ( char const * file , char const * argv []); int execvpe ( const char * file , char * const argv [], char * const envp []); int fexecve ( int fd , char * const argv [], char * const envp []);Algunas implementaciones proporcionan estas funciones nombradas con un guion bajo inicial (por ejemplo, _execl). [ 2 ]
La base de cada uno es exec , seguida de una o más letras:
- e – Las variables de entorno se pasan como una matriz de punteros a cadenas terminadas en nulo con el formato
name=value. El último elemento de la matriz debe ser un puntero nulo . [ 3 ] - l – Los argumentos de la línea de comandos se pasan como punteros individuales a cadenas terminadas en nulo. El último argumento debe ser un puntero nulo.
- p – Utiliza la variable de entorno PATH para encontrar el archivo especificado en el argumento file que se va a ejecutar.
- v – Los argumentos de la línea de comandos se pasan como una matriz de punteros a cadenas terminadas en nulo. El último elemento de la matriz debe ser un puntero nulo. [ 3 ]
- f (prefijo) – En su lugar, se pasa un descriptor de archivo. El descriptor de archivo debe abrirse con O_RDONLY u O_PATH y quien realiza la llamada debe tener permiso para ejecutar su archivo. [ 4 ]
En las funciones donde no se pueden pasar variables de entorno ( execl(), execlp(), execv(), execvp()), la nueva imagen del proceso hereda las variables de entorno actuales.
Primer argumento de la línea de comandos
El primer argumento arg0suele ser el nombre del archivo ejecutable y puede tener el mismo valor que el pathargumento. Sin embargo, esto es pura convención y no hay garantía de este comportamiento, ni está estandarizado. Por ejemplo, en Java , el primer argumento no es la ruta al ejecutable, sino el primer argumento del programa. [ 5 ]
Efectos
Un descriptor de archivo abierto al exec()realizar una llamada permanece abierto en la nueva imagen del proceso, a menos que se haya llamado a fcntl() o se haya abierto con (esto último se introdujo en POSIX.1-2001). Este aspecto se utiliza para especificar los flujos estándar del nuevo programa.FD_CLOEXECO_CLOEXEC
Una superposición exitosa destruye el espacio de direcciones de memoria anterior del proceso. Todas las áreas de memoria que no se compartieron son recuperadas por el sistema operativo. En consecuencia, todos los datos que no se transfirieron al nuevo programa o que no se guardaron de otra manera se pierden.
Valor de retorno
Una llamada exitosa reemplaza la imagen del proceso actual, por lo que no puede devolver nada al programa que realizó la llamada. Los procesos tienen un estado de salida , pero ese valor lo recopila el proceso padre .
Si la llamada falla, el valor de retorno siempre es -1, y errno se establece en un valor apropiado. [ 6 ]
En DOS
DOS no es un sistema operativo multitarea , pero reemplazar la imagen ejecutable anterior es esencial debido a las severas limitaciones de memoria primaria y la falta de memoria virtual . Se utiliza la misma API para superponer programas en DOS, con efectos similares a los de los sistemas POSIX.
Las funciones de MS-DOSexec() siempre cargan el nuevo programa en la memoria como si la "asignación máxima" en el encabezado del archivo ejecutable del programa estuviera establecida en el valor predeterminado de 0xFFFF. La utilidad EXEHDR se puede usar para cambiar el campo de asignación máxima de un programa. Sin embargo, si se realiza esta modificación y el programa se invoca con una de las exec()funciones, su comportamiento podría ser diferente al de un programa invocado directamente desde la línea de comandos del sistema operativo o con una de las spawn()funciones (véase más abajo ).
En conchas
Muchos intérpretes de comandos de Unix también ofrecen un execcomando integrado que reemplaza el proceso del intérprete con el programa especificado. [ 1 ] [ 7 ] Los scripts de envoltura suelen usar este comando para ejecutar un programa (ya sea directamente o a través de un intérprete o máquina virtual ) después de establecer variables de entorno u otra configuración. Al usar exec, los recursos utilizados por el programa del intérprete no necesitan permanecer en uso después de que el programa se haya iniciado. [ 8 ]
El comando también puede realizar una redirección . En algunos shells, es posible usarlo solo para redirigir, sin crear una superposición real.
En otros sistemas
OS/360 y sus sucesores incluyen una llamada al sistema XCTL(control de transferencia) que realiza una función similar a la de exec. [ 9 ]
Ejecutivo versus generador
El sistema Unix tradicional no cuenta con la funcionalidad para crear un nuevo proceso que ejecute un nuevo programa ejecutable en un solo paso. Otros sistemas pueden usar `spawn` como herramienta principal para ejecutar programas ejecutables. Su resultado es equivalente a la secuencia `fork-exec` de los sistemas tipo Unix. POSIX admite las rutinas `posix_spawn` como una extensión opcional. [ 10 ]
Véase también
- Carga en cadena , superposición en la programación del sistema
- exit (llamada al sistema) , para finalizar un proceso.
- fork (llamada al sistema) , para crear un nuevo proceso (pero con el mismo ejecutable).
- clone() , una forma de crear nuevos hilos
Referencias
- 1 2 – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ Whitney, Tyler. "Funciones _exec, _wexec" . learn.microsoft.com . Consultado el 26 de mayo de 2025 .
- 1 2 – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ "Java - Su lanzador de aplicaciones - Dev.java" . Dev.java: El destino para desarrolladores Java . Consultado el 26 de mayo de 2025 .
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- ↑ Sharma, Sagar (28-05-2023). "Uso del comando exec en scripts de shell Bash [ 4 ejemplos ] " . Manual de Linux . Consultado el 26-05-2025 .
- ↑ "Shell Wrappers" . Proyecto de Documentación de Linux . 10 de marzo de 2014. Consultado el 18 de febrero de 2021 .
- ↑ "XCTL" . www.ibm.com . Consultado el 26 de mayo de 2025 .
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
- Proceso (informática)
- POSIX
- Proceso.h
- Utilidades Unix SUS2008
- llamadas al sistema