Spawn en informática se refiere a una función que carga y ejecuta un nuevo proceso hijo . El proceso actual puede esperar a que el niño termine o puede continuar ejecutando computación concurrente . La creación de un nuevo subproceso requiere suficiente memoria en la que se pueden ejecutar tanto el proceso hijo como el programa actual.
Existe una familia de funciones de generación en DOS , heredadas por Microsoft Windows .
También hay una familia diferente de funciones de generación en una extensión opcional de los estándares POSIX . [1]
Funciones de generación de DOS / Windows
Las funciones de generación de DOS / Windows están inspiradas en las funciones fork y exec de Unix ; sin embargo, como estos sistemas operativos no son compatibles con fork, [2] la función spawn se suministró como un reemplazo para la combinación fork-exec. Sin embargo, la función de generación, aunque se ocupa adecuadamente de los casos de uso más comunes, carece de toda la potencia de fork-exec, ya que después de la bifurcación se puede cambiar cualquier configuración de proceso que sobrevivirá a un ejecutivo. Sin embargo, en la mayoría de los casos, esta deficiencia se puede compensar utilizando la API CreateProcess de nivel más bajo.
En las llamadas spawnl , spawnlp , spawnv y spawnvp , el proceso hijo hereda el entorno del padre. Los archivos que están abiertos cuando se realiza una llamada de generación permanecen abiertos en el proceso hijo.
Prototipo
int spawnl(int mode, char *path, char *arg0, ...);
int spawnle(int mode, char *path, char *arg0, ..., char ** envp);
int spawnlp(int mode, char *path, char *arg0, ...);
int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);
int spawnv(int mode, char *path, char **argv);
int spawnve(int mode, char *path, char **argv, char ** envp);
int spawnvp(int mode, char *path, char **argv);
int spawnvpe(int mode, char *path, char **argv, char ** envp);
Nombres de funciones
El nombre de la base de cada función se desovar , seguido de una o más letras:
Letra | Notas |
---|---|
l | Los argumentos de la línea de comando se pasan individualmente a la función. |
v | Los argumentos de la línea de comandos se pasan a la función como una matriz de punteros. |
pag | Utiliza la variable de argumento PATH para encontrar el archivo que se ejecutará. |
mi | Una matriz de punteros a los argumentos del entorno se pasa explícitamente al proceso hijo. |
Modo
El argumento de modo determina la forma en que se ejecuta el niño. Los valores para el modo son:
Nombre | Notas |
---|---|
P_OVERLAY | Superpone el proceso padre con el hijo, lo que destruye al padre. Esto tiene el mismo efecto que las funciones exec *. |
P_WAIT | Suspende el proceso padre hasta que el proceso hijo haya terminado de ejecutarse (generación sincrónica). |
P_NOWAIT, P_NOWAITO | Continúa ejecutando el proceso de llamada al mismo tiempo que el nuevo proceso (generación asincrónica). |
P_DETACH | el niño se ejecuta en segundo plano sin acceso a la consola o al teclado. Las llamadas a _cwait sobre el nuevo proceso fallarán (generación asincrónica) |
Camino
El argumento de la ruta especifica el nombre de archivo del programa a ejecutar. Solo para spawnlp y spawnvp , si el nombre del archivo no tiene una ruta y no está en el directorio actual, la variable de entorno PATH determina en qué directorios buscar el archivo. La cadena a la que apunta argv [0] es el nombre del programa que se ejecutará.
La línea de comando que se pasa al programa generado se compone de las cadenas de caracteres, arg0 través argn , en el desove llamada. La longitud combinada máxima aceptada de estas cadenas difiere entre compiladores, que van desde 128 caracteres en Digital Mars [3] hasta 1024 en Microsoft Visual C ++ [4] o tanto como lo permita la memoria, en DJGPP. [5] El último argumento después de argn tiene que ser un puntero NULL.
argv
El argumento argv es una matriz de punteros de caracteres. El último puntero de la matriz debe ser nulo para indicar el final de la lista.
envp
Las llamadas spawnle , spawnlpe , spawnve y spawnvpe permiten al usuario alterar el entorno del proceso hijo pasando una lista de configuraciones de entorno en el argumento envp . Este argumento es una matriz de punteros de caracteres; cada puntero (excepto el último) apunta a una cadena terminada en nulo que define una variable de entorno. Una variable de entorno tiene la forma:
nombre = valor
donde nombre es el nombre de la variable y valor es su valor. El último puntero de la matriz es nulo. Cuando el argumento envp es nulo, el hijo hereda la configuración del entorno del padre.
En Microsoft Windows, las funciones de generación * utilizan LoadModule para ejecutar el proceso generado; y si esto falla, se intenta generar un proceso normal de MS-DOS. Si se genera una aplicación de Windows, el identificador de la instancia se puede obtener mediante exec_instancehandleget . Es posible especificar cómo se mostrará el programa generado usando las funciones _exec_showset , _exec_showget y _exec_showreset .
Valores devueltos
El valor de retorno indica el estado de salida del programa generado. Un valor de cero indica que el programa generado se ejecutó correctamente. Un valor positivo indica que el programa generado se ejecutó, pero fue abortado o terminó con un error, el valor devuelto es el estado de salida del proceso hijo. Un valor negativo indica que el programa generado no se ejecutó y errno está establecido. En Microsoft Windows, spawn devuelve el código de error negado devuelto por LoadModule para compatibilidad con la biblioteca de tiempo de ejecución de C. Se pueden encontrar los siguientes códigos de error:
Valor | Notas |
---|---|
-2 | Archivo no encontrado |
-3 | Camino no encontrado |
-11 | Archivo .exe no válido (para Windows) |
-13 | Aplicación DOS 4. 0 |
-14 | Tipo .exe desconocido (puede ser DOS extendido) |
Funciones de generación de POSIX
El posix_spawnp
se pueden usar como reemplazos para fork y exec , pero no brinda la misma flexibilidad que usar fork
y por exec
separado. Pueden ser reemplazos eficientes para fork
y exec
, pero su propósito es proporcionar primitivas de creación de procesos en entornos embebidos donde fork
no es compatible debido a la falta de traducción dinámica de direcciones .
Historia
La metáfora del desove , es decir, producir descendencia como en la deposición de huevos, tuvo su uso temprano en el sistema operativo VMS, ahora OpenVMS (1977). En el mundo académico, existía un animado debate entre los defensores de la bifurcación Unix (copia burda del diseño de la memoria, pero rápido) versus el spawn de VMS (construcción confiable de parámetros de proceso, pero más lento). Este debate revivió cuando el mecanismo de generación de VMS fue heredado por Windows NT (1993).
Ver también
Referencias
- ^ Posix.1-2008 spawn.h
- ^ para Windows NT al menos en la API de Win32 ; Los entornos de emulación POSIX como Cygwin o SFU sí
- ^ Proceso de Marte digital. H
- ^ Microsoft MSDN
- ^ Generación de DJGPP *