En informática , exec es una funcionalidad de un sistema operativo que ejecuta un archivo ejecutable en el contexto de un proceso ya existente , reemplazando al ejecutable anterior. Este acto también se conoce como superposición . Es especialmente importante en sistemas similares a Unix, aunque existe en otros lugares. Como no se crea ningún proceso nuevo, el identificador de proceso (PID) no cambia, pero el código de la máquina , los datos , el montón y la pila del proceso se reemplazan por los del nuevo programa.
La llamada ejecutiva está disponible para muchos lenguajes de programación, incluidos los lenguajes compilables y algunos lenguajes de secuencias de comandos . En intérpretes de comandos del sistema operativo , el ejecutivo de comando integrado reemplaza el proceso de shell con el programa especificado. [1]
Nomenclatura
Las interfaces para el ejecutivo y sus implementaciones varían. Dependiendo del lenguaje de programación , puede ser accesible a través de una o más funciones y, según el sistema operativo, puede representarse con una o más llamadas al sistema reales . Por esta razón, a veces se describe a exec como una colección de funciones .
Los nombres estándar de tales funciones en C sonexecl ,execle ,execlp ,execv ,execve , yexecvp (ver más abajo ), pero no "exec" en sí. El kernel de Linux tiene una llamada al sistema correspondiente llamada "execve", mientras que todas las funciones antes mencionadas son envoltorios de espacio de usuario a su alrededor.
Los lenguajes de nivel superior suelen proporcionar una llamada denominada ejecutivo .
Unix, POSIX y otros sistemas multitarea
Prototipos en lenguaje C
El estándar POSIX declara funciones exec en el unistd.h archivo de cabecera, en el lenguaje C . Las mismas funciones se declaran en process.h para DOS (ver 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[]);
Algunas implementaciones proporcionan estas funciones nombradas con un subrayado inicial (por ejemplo, _execl).
La base de cada uno es exec (ejecutar), seguido de una o más letras:
- e - Se pasa explícitamente una matriz de punteros a variables de entorno a la nueva imagen del proceso.
- l - Los argumentos de la línea de comandos se pasan individualmente (a l ist) a la función.
- p : utiliza la variable de entorno PATH para encontrar el archivo nombrado en el argumento de archivo que se ejecutará.
- v : los argumentos de la línea de comandos se pasan a la función como una matriz ( v ector) de punteros.
- camino
El argumento especifica el nombre de la ruta del archivo que se ejecutará como la nueva imagen del proceso. Los argumentos que comienzan en arg0 son indicadores de argumentos que se pasarán a la nueva imagen del proceso. El valor argv es una matriz de punteros a argumentos.
- arg0
El primer argumento arg0 debe ser el nombre del archivo ejecutable. Por lo general, es el mismo valor que el argumento de ruta . Algunos programas pueden confiar incorrectamente en este argumento que proporciona la ubicación del ejecutable, pero no hay garantía de esto ni está estandarizado en todas las plataformas.
- envp
Argument envp es una serie de punteros a la configuración del entorno. Las llamadas ejecutivas nombradas que terminan con una e alteran el entorno para la nueva imagen de proceso pasando una lista de configuraciones de entorno a través del argumento envp . Este argumento es una matriz de punteros de caracteres; cada elemento (excepto el elemento final) apunta a una cadena terminada en nulo que define una variable de entorno .
Cada cadena terminada en nulo tiene la forma:
name=value
donde nombre es el nombre de la variable de entorno y valor es el valor de esa variable. El elemento final de la matriz envp debe ser nulo .
En el execl , execlp , execv , y execvp , la nueva imagen de proceso hereda las variables de entorno actuales.
Efectos
Un descriptor de archivo abierto cuando se realiza una llamada ejecutiva permanece abierto en la nueva imagen de proceso, a menos que se fcntl ed con FD_CLOEXEC o abierto con O_CLOEXEC (este último se introdujo en POSIX.1-2001). Este aspecto se utiliza para especificar los flujos estándar (stdin, stdout y stderr) del nuevo programa.
Una superposición exitosa destruye el espacio de direcciones de memoria anterior del proceso y todas sus áreas de memoria, que no fueron compartidas , son reclamadas por el sistema operativo. En consecuencia, todos los datos que no se pasaron al nuevo programa, o que no se guardaron, se pierden.
Valor devuelto
Un ejecutivo exitoso 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 el proceso principal recopila ese valor .
Si una función ejecutiva regresa al programa de llamada, se produce un error, el valor de retorno es -1 y errno se establece en uno de los siguientes valores:
Nombre | Notas |
---|---|
E2BIG | La lista de argumentos supera el límite del sistema. |
EACCES | El archivo especificado tiene una infracción de bloqueo o uso compartido. |
ENOENT | No se encontró el nombre de archivo o ruta. |
ENOMEM | No hay suficiente memoria disponible para ejecutar la nueva imagen de proceso. |
Sistemas operativos DOS
DOS no es un sistema operativo multitarea , pero reemplazar la imagen ejecutable anterior tiene un gran mérito debido a las severas limitaciones de la memoria primaria y la falta de memoria virtual . La misma API se utiliza para superponer programas en DOS y tiene efectos similares a los de los sistemas POSIX.
Las funciones ejecutivas de MS-DOS 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 0xFFFF. La utilidad EXEHDR se puede utilizar para cambiar el campo de asignación máxima de un programa. Sin embargo, si se hace esto y se invoca el programa con una de las funciones exec , el programa podría comportarse de manera diferente a un programa invocado directamente desde la línea de comandos del sistema operativo o con una de las funciones de generación (ver más abajo ).
Intérpretes de comando
Muchos shells de Unix también ofrecen un comando exec que reemplaza el proceso de shell con el programa especificado. [1] Los scripts de Wrapper a menudo usan este comando para ejecutar un programa (ya sea directamente oa 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 usados por el programa de shell no necesitan permanecer en uso después de que se inicia el programa. [2]
La El comando exec también puede realizar una redirección . En algunas conchas, incluso es posible utilizar el exec solo para redireccionamiento, sin hacer una superposición real.
Alternativas
El sistema Unix tradicional no tiene la funcionalidad para crear un nuevo proceso que ejecute un nuevo programa ejecutable en un solo paso, lo que explica la importancia de exec para la programación Unix. Otros sistemas pueden usar spawn como herramienta principal para ejecutar ejecutables. Su resultado es equivalente a la secuencia fork-exec de sistemas similares a Unix. POSIX admite las rutinas posix_spawn como una extensión opcional que generalmente se implementa usando vfork .
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.
Ver también
- Carga de cadena , superposición en la programación del sistema
- salir (llamada al sistema) , finalizar un proceso
- fork (llamada al sistema) , crea un nuevo proceso (pero con el mismo ejecutable)
- clone () , la forma de crear nuevos hilos
- PATH (variable) , relacionada con la semántica de la * argumento de ruta
Referencias
- ^ a b "exec (3) - página de manual de Linux" . man7.org . Consultado el 14 de octubre de 2016 .
- ^ "Envoltorios de conchas" . Proyecto de documentación de Linux . 2014-03-10 . Consultado el 18 de febrero de 2021 .
enlaces externos
- : ejecutar un archivo - Referencia de interfaces del sistema, Especificación única de UNIX , Edición 7 de The Open Group