stringtranslate.com

ejecutivo (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 al ejecutable anterior. Este acto 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 ningún proceso nuevo, 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 ejecutiva está disponible para muchos lenguajes de programación , incluidos los lenguajes compilables y algunos lenguajes de secuencias de comandos . En los intérpretes de comandos del sistema operativo , el comando integrado exec reemplaza el proceso de shell con el programa especificado. [1]

Nomenclatura

Las interfaces para ejecutar 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 reales al sistema . Por esta razón, a veces se describe exec como una colección de funciones .

Los nombres estándar de dichas funciones en C son execl , execle , execlp , execv , execve y execvp (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 exec .

Unix, POSIX y otros sistemas multitarea

prototipos de lenguaje C

El estándar POSIX declara funciones ejecutivas 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), seguida 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 (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 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. Normalmente tiene el mismo valor que el argumento de la ruta . Algunos programas pueden basarse incorrectamente en este argumento que proporciona la ubicación del ejecutable, pero no hay garantía de ello ni está estandarizado en todas las plataformas.

envp

El argumento envp es una serie de punteros a la configuración del entorno. Las llamadas ejecutivas con nombre que terminan en e modifican el entorno para la nueva imagen del proceso pasando una lista de configuraciones de entorno a través del argumento envp . Este argumento es una serie 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 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 ejecutiva permanece abierto en la nueva imagen del proceso, a menos que se haya configurado 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 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 de retorno

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 ese valor lo recopila el proceso padre .

Si una función ejecutiva regresa al programa que realiza la llamada, 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 duras 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 configurada 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 el programa se invoca con una de las funciones ejecutivas , 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 comandos

Muchos shells de Unix también ofrecen un comando ejecutivo incorporado que reemplaza el proceso del shell con el programa especificado. [1] Los scripts de envoltura a menudo usan 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 utilizar exec , no es necesario que los recursos utilizados por el programa shell sigan utilizándose después de iniciar 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 utilizar spawn como herramienta principal para ejecutar ejecutables. Su resultado es equivalente a la secuencia fork-exec de sistemas tipo 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 exec.

Ver también

Referencias

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

enlaces externos