¿Por qué usar Posix Spawn??
El posix_spawn () y posix_spawnp () Las funciones se utilizan para crear un nuevo proceso infantil. El proceso infantil luego ejecuta un archivo. POSIX especificó estas funciones para estandarizar el método de crear nuevos procesos para máquinas que no tienen soporte de llamadas al sistema de bifurcación. Estas máquinas suelen ser pequeñas y carecen de los sistemas integrados para el soporte de LMMU.
Las dos funciones combinan Fork y Exec, con algunos pasos adicionales que ejecutarán al niño. Actúan como un subconjunto de funcionalidades, generalmente logradas con un tenedor, para todas las llamadas del sistema y sistemas integrados que carecen de tal funcionalidad.
Ejemplo 1: Posix_spawn ()
En este ejemplo, usaremos la función Spawn () para crear y ejecutar un nuevo proceso infantil. Luego, explicaremos todos los argumentos relevantes utilizados en la función.
Los argumentos utilizados en el ejemplo son los siguientes:
Argumento | Descripción |
---|---|
Se usa para definir todas las operaciones de rendimiento de desove. | |
camino | El nombre de la ruta que se ejecutará. |
FD_COUNT | El número de entradas con la matriz de FD_MAP. Si fd_count es igual a 0, entonces se ignora el fd_map. En tales casos, el proceso infantil hereda todos los descriptores de archivos, ignorando los que fueron modificados. |
fd_map | Una variedad de descriptores de archivos que se heredará el proceso infantil. Aquí, si el valor de fd_count no es 0, entonces se necesita FD_MAP para llevar los descriptores de archivos FD_COUNT a un valor supremo de Open_Max. Tiene: · La entrada del proceso del niño · La salida · Los valores de error |
heredar | La herencia de estructura muestra que los usuarios quieren que el proceso de su hijo herede todo, desde los padres. |
argv | El puntero a un vector de argumento en particular. El valor argv [0] no puede ser nulo y debe ser el nombre de archivo que se está cargando. El valor de argv no puede ser igual a nulo. |
envidiar | Apunta a una variedad de punteros de personajes. Cada uno de los punteros en esta matriz apunta a una variable de entorno. El punto de finalización de la matriz es un puntero nulo. |
Ejemplo 2: prueba.C
En el siguiente ejemplo, se crea un nuevo proceso infantil para ejecutar el comando mediante /bin/sh -c. Este es el valor aprobado como el primer argumento. El prueba.C El código es el siguiente:
En el ejemplo anterior, llamamos a las bibliotecas, luego llamamos al Aparecer.H encabezamiento. También verás el posix_spawn () llamado para crear un proceso infantil en el ejemplo anterior. El Aparecer y asignación Las funciones se utilizan en lugar de la tenedor y ejecución funciones. Aparecer() tiene flexibilidad y proporciona mucha facilidad a los usuarios de muchas maneras. Es un poco diferente de sistema() y exec (). Regresará y creará el proceso de niño fresco. En nuestro ejemplo, es pid. Arriba, puede ver que la función de espera Waitpid (), entonces sistema() se usa. Observe que el Aparecer() y tenedor() Los procesos de llamadas son los mismos, y el método de implementación es más o menos el mismo para ambas funciones.
Ahora ejecutaremos el ejemplo usando un GCC compilador. También puede usar cualquier otro compilador de su elección:
Prueba de $ sudo GCC.C -LRT
A continuación, ejecute lo siguiente:
ps ./a.afuera
La salida del comando anterior se verá de la siguiente manera:
El niño pid se creará, como puede ver en la salida anterior.
Biblioteca
Libc: Usa el -l c para vincular el GCC compilador. Aquí, observe que esta biblioteca se incluye automáticamente.
Aparecer()
El Aparecer() La función se basa en Posix 1003.Estándar de borrador 1D utilizado como posix_spawn (). La biblioteca C incluye funciones de Spawn*(). Aquí, enumeraremos algunos sufijos, junto con sus descripciones:
mi: utilizado como una matriz para variables de entorno.
L: utilizado como una lista nula de los argumentos utilizados dentro del programa.
pag: utilizado para definir una ruta relativa. Si la ruta no tiene un corte en su valor, entonces el sistema usa y busca la variable de entorno de ruta para cualquier programa similar.
V: actúa como un vector de argumentos dentro del programa.
Mapeo de descriptores de archivos
En Aparecer(), Practicamos el FD_COUNT y fd_map Argumentos para llamar a los descriptores de archivo. Especifica qué niño heredar.
El número utilizado como descriptor de archivo para el proceso infantil depende de su ubicación dentro del fd_map. Aquí, consideraremos el ejemplo del padre con descriptores de archivo valorados 1, 3 y 5, entonces la asignación será algo como esto:
>> int fd_map = 1, 3, 5;
Para el niño | Para el padre |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Tenga en cuenta que si está utilizando el explícito fd_map Para que coincidan con estos descriptores de archivos con el niño y el padre, entonces debe asignar el Spwan_fdclose función para continuar.
Banderas de herencia
En Spawn, los usuarios deben llamar a cualquiera de las siguientes banderas en caso de herencia. Algunos ejemplos de banderas de desenchera y sus descripciones se dan a continuación:
Bandera | Descripción |
---|---|
Spawn_align_default | Este indicador se utiliza para configurar la configuración predeterminada de la configuración para la alineación. |
Spawn_align_fault | Este indicador se usa para la desalineación de fallas de las referencias de datos. |
Spawn_align_nofault | Esta bandera se usa para arreglar la desalineación de la falla. |
Spawn_debug | Esta bandera se usa para depurar el núcleo. |
Spawn_exec | Spawn actúa como exec*() usando esta bandera. |
Spawn_explicit_cpu | Este indicador se usa para configurar la máscara de ejecución y heredar el miembro de máscara de máscara = Run Mask. |
Spawn_explicit_sched | Esta bandera se utiliza para establecer la política de programación. |
El <Aparecer.H> Define esa máscara Spawn_align_mask Se usa para alinear las banderas enumeradas anteriormente.
pid_t pgroup | El grupo de procesos infantiles si especifica el Spawn_SetGroup en el miembro de la bandera. |
int runmask | La máscara de ejecución del proceso infantil para heredar las máscaras que se acuerdan en función del valor de este miembro. |
Sigset_t sigmask | La máscara de señal para el proceso infantil que se utiliza para especificar el estado de los miembros del indicador. |
Sigset_t sigdefault | El conjunto de procesos infantiles de las señales predeterminadas. |
Errores
El posix_spawn () y posix_spawnp () Las funciones también pueden fallar en algunos casos, como las siguientes:
Einval: Este es el caso cuando el valor identificado por File_actions o ATTRP no es correcto y adecuado.
Cuando el bifurcado subyacente (2), la hornera (2) o el clon (2) la llamada falla, la Aparecer() Las funciones devolverán un número de error.
Enosys: Este es el caso si la función y su soporte no se incluyen o se proporcionan dentro de un sistema.
Conclusión
Este tutorial cubrió las funcionalidades básicas proporcionadas por Posix_spawn () y las funciones utilizadas por él para ejecutar y realizar sus funciones. También cubrimos las banderas y errores comúnmente utilizados por Spawn.