stringtranslate.com

exec (llamada al sistema)

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 el ejecutable anterior. Esta acción también se conoce como superposición . Es especialmente importante en sistemas tipo Unix , aunque también existe en otros lugares. Como no se crea un nuevo proceso, el identificador de proceso (PID) no cambia, pero el código de máquina , los datos , el montón y la pila del proceso se reemplazan por los del nuevo programa.

La llamada exec está disponible para muchos lenguajes de programación, incluidos los lenguajes compilables y algunos lenguajes de script . En los intérpretes de comandos del sistema operativo , el comando integrado exec reemplaza el proceso del shell con el programa especificado. [1]

Nomenclatura

Las interfaces de exec y sus implementaciones varían. Según el lenguaje de programación, puede accederse a ellas 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 este motivo, a veces se describe a exec como una colección de funciones .

Los nombres estándar de estas funciones en C son execl , execle , execlp , execv , execve y execvp (ver más abajo), pero no "exec" en sí. El núcleo de Linux tiene una llamada de sistema correspondiente llamada "execve", mientras que todas las funciones mencionadas anteriormente son envoltorios de espacio de usuario a su alrededor.

Los lenguajes de nivel superior generalmente proporcionan una llamada llamada exec .

Unix, POSIX y otros sistemas multitarea

Prototipos en lenguaje C

El estándar POSIX declara funciones exec en el archivo de encabezado unistd.h , en 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[]);int fexecve(int fd, char *const argv[], char *const envp[]);

Algunas implementaciones proporcionan estas funciones nombradas con un guión bajo 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.
lLos argumentos de la línea de comandos se pasan individualmente (una lista ) a la función.
p – Utiliza la variable de entorno PATH para encontrar el archivo nombrado en el argumento del archivo que se ejecutará.
v – Los argumentos de la línea de comandos se pasan a la función como una matriz ( vector ) 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 punteros a los argumentos que se pasarán a la nueva imagen del proceso. El valor argv es una matriz de punteros a los argumentos.

arg0

El primer argumento arg0 debe ser el nombre del archivo ejecutable. Normalmente es el mismo valor que el argumento path . Algunos programas pueden basarse incorrectamente en este argumento para proporcionar la ubicación del ejecutable, pero no hay garantía de que esto suceda ni está estandarizado en todas las plataformas.

sobreenvp

El argumento envp es una matriz de punteros a configuraciones de entorno. Las llamadas exec que terminan con una e modifican el entorno para la nueva imagen de proceso al pasar 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 null .

En las llamadas execl , execlp , execv y execvp , la nueva imagen del proceso hereda las variables de entorno actuales.

Efectos

Un descriptor de archivo abierto cuando se realiza una llamada de ejecución permanece abierto en la nueva imagen de proceso, a menos que se haya modificado con FD_CLOEXEC o se haya 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 las áreas de memoria que no fueron compartidas son recuperadas por el sistema operativo. En consecuencia, todos los datos que no fueron transferidos al nuevo programa o que no fueron guardados de otra manera se pierden.

Valor de retorno

Una ejecución 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 principal .

Si una función de ejecución regresa al programa que la llama, se produce un error, el valor de retorno es −1 y errno se establece en uno de los siguientes valores:

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 de ejecución 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 de ejecución , el programa puede comportarse de manera diferente a un programa invocado directamente desde la línea de comandos del sistema operativo o con una de las funciones spawn (ver a continuación).

Intérpretes de órdenes

Muchos shells de Unix también ofrecen un comando exec integrado que reemplaza el proceso del shell con el programa especificado. [1] Los scripts de contenedor suelen utilizar este comando para ejecutar un programa (ya sea directamente o a través de un intérprete o una máquina virtual ) después de configurar las variables de entorno u otra configuración. Al utilizar exec , los recursos utilizados por el programa del shell no necesitan permanecer en uso después de que se inicia el programa. [2]

El comando exec también puede realizar una redirección . En algunos shells, incluso es posible utilizar el comando exec solo para la redirección, sin realizar 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 la herramienta principal para ejecutar 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 que generalmente se implementa utilizando vfork .

Otros sistemas

OS/360 y sus sucesores incluyen una llamada de sistema XCTL (control de transferencia) que realiza una función similar a exec.

Véase también

Referencias

  1. ^ ab "exec(3) - Página del manual de Linux". man7.org . Consultado el 14 de octubre de 2016 .
  2. ^ "Shell Wrappers". Proyecto de documentación de Linux . 2014-03-10 . Consultado el 2021-02-18 .

Enlaces externos