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 puedan 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]
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 admiten fork, [2] la función spawn se proporcionó como reemplazo de la combinación fork-exec. Sin embargo, la función spawn, 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 sobreviva a un exec. 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 secundario.
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);
El nombre base de cada función es spawn , seguido de una o más letras:
El argumento modo determina la forma en que se ejecuta el niño. Los valores para la moda son:
El argumento de 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 a ejecutar.
La línea de comando pasada al programa generado se compone de cadenas de caracteres, arg0 a argn , en la llamada de generación . La longitud combinada máxima aceptada de estas cadenas difiere entre compiladores, y oscila entre 128 caracteres en Digital Mars [3] y 1024 en Microsoft Visual C++ [4] o tanto como la memoria lo permita, en DJGPP. [5] El último argumento después de argn tiene que ser un puntero NULL.
El argumento argv es una serie de punteros de caracteres. El último puntero de la matriz debe ser nulo para indicar el final de la lista.
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 serie 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 spawn* usan LoadModule para ejecutar el proceso generado; y si esto falla, se intenta generar un proceso MS-DOS normal. Si se genera una aplicación de Windows, el identificador de instancia se puede obtener usando exec_instancehandleget . Es posible especificar cómo se mostrará el programa generado utilizando las funciones _exec_showset , _exec_showget y _exec_showreset .
El valor de retorno indica el estado de salida del programa generado. Un valor de cero indica que el programa generado se ejecutó exitosamente. Un valor positivo indica que el programa generado se ejecutó, pero se abortó o finalizó por error; el valor devuelto es el estado de salida del proceso hijo. Un valor negativo indica que el programa generado no se ejecutó y se establece errno. En Microsoft Windows, spawn devuelve el código de error negado devuelto por LoadModule por compatibilidad con la biblioteca de tiempo de ejecución de C. Se pueden encontrar los siguientes códigos de error:
The posix_spawnp
se pueden usar como reemplazos de fork y exec , pero no brindan la misma flexibilidad que usar fork
y exec
por separado. Pueden ser reemplazos eficientes para fork
y exec
, pero su propósito es proporcionar primitivas de creación de procesos en entornos integrados donde fork
no son compatibles debido a la falta de traducción dinámica de direcciones .
La metáfora del desove , es decir, producir descendencia como en la deposición de huevos, tuvo su primer uso 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 de Unix (copia tosca del diseño de la memoria, pero rápida) versus el spawn de VMS (construcción confiable de parámetros de proceso, pero más lento). Este debate revivió cuando Windows NT heredó el mecanismo de generación de VMS (1993).