Pourquoi utiliser POSIX Spawn?
Le posix_spawn () et posix_spawnp () Les fonctions sont toutes deux utilisées pour créer un nouveau processus enfant. Le processus de l'enfant exécute ensuite un fichier. Ces fonctions ont été spécifiées par POSIX pour standardiser la méthode de création de nouveaux processus pour les machines qui n'ont pas de support d'appel du système de fourchette. Ces machines sont généralement petites et n'ont pas les systèmes intégrés pour le support LMMU.
Les deux fonctions combinent Fork et Exec, avec quelques étapes supplémentaires qui exécuteront l'enfant. Ils agissent comme un sous-ensemble de fonctionnalités, généralement obtenus avec une fourche, pour tous les appels du système et les systèmes intégrés qui manquent de telles fonctionnalités.
Exemple 1: POSIX_SPAWN ()
Dans cet exemple, nous utiliserons la fonction Spawn () pour créer et exécuter un nouveau processus enfant. Ensuite, nous expliquerons tous les arguments pertinents utilisés dans la fonction.
Les arguments utilisés dans l'exemple sont les suivants:
Argument | Description |
---|---|
Utilisé pour définir toutes les opérations de réalisation. | |
chemin | Le nom du chemin qui doit être exécuté. |
fd_count | Le numéro des entrées avec le tableau de FD_MAP. Si fd_count est égal à 0, alors le fd_map est ignoré. Dans de tels cas, le processus de l'enfant hérite de tous les descripteurs de fichiers, ignorant ceux qui ont été modifiés. |
fd_map | Un tableau de descripteurs de fichiers à hériter par le processus de l'enfant. Ici, si la valeur de fd_count n'est pas 0, alors fd_map est nécessaire pour amener les descripteurs de fichiers fd_count jusqu'à une valeur suprême d'Open_Max. Il a: · L'entrée du processus de l'enfant · Le résultat · Les valeurs d'erreur |
hériter | L'héritage structure montre que les utilisateurs souhaitent que leur processus d'enfant hérite de tout, du parent. |
argv | Le pointeur vers un vecteur d'argument particulier. La valeur argv [0] ne peut pas être nul et doit être le nom de fichier qui est chargé. La valeur argv ne peut pas être égale à Null. |
envp | Pointe vers un tableau de pointeurs de personnages. Chacun des pointeurs de ce tableau indique une variable d'environnement. Le point d'arrivée du tableau est un pointeur nul. |
Exemple 2: test.c
Dans l'exemple suivant, un nouveau processus enfant est créé pour exécuter la commande par / bin / sh -c. C'est la valeur passée comme le premier argument. Le test.c Le code est le suivant:
Dans l'exemple ci-dessus, nous avons appelé les bibliothèques, alors appelée le frayer.H entête. Vous verrez également le posix_spawn () appelé pour créer un processus d'enfant dans l'exemple ci-dessus. Le frayer et se souligner Les fonctions sont utilisées à la place du fourchette et exécutif les fonctions. Frayer() a de la flexibilité et offre beaucoup de facilité aux utilisateurs à bien des égards. C'est un peu différent de système() et exec (). Il reviendra et créera le processus d'enfant frais. Dans notre exemple, c'est piquer. Ci-dessus, vous pouvez voir que la fonction d'attente waitPid (), alors système() est utilisé. Notez que le frayer() et fourchette() Les processus d'appel sont les mêmes, et la méthode d'implémentation est plus ou moins la même pour les deux fonctions.
Nous allons maintenant exécuter l'exemple en utilisant un GCC compilateur. Vous pouvez également utiliser tout autre compilateur de votre choix:
$ sudo gcc test.c -lrt
Ensuite, exécutez ce qui suit:
$ ./un.dehors
La sortie de la commande ci-dessus ressemblera comme suit:
L'enfant piquer sera créé, comme vous pouvez le voir dans la sortie ci-dessus.
Bibliothèque
Libc: Utilisez le -l c pour lier le GCC compilateur. Ici, notez que cette bibliothèque est incluse automatiquement.
Frayer()
Le frayer() La fonction est basée sur POSIX 1003.Norme de projet 1D utilisé comme posix_spawn (). La bibliothèque C comprend des fonctions Spawn * (). Ici, nous listerons quelques suffixes, ainsi que leurs descriptions:
E: utilisé comme tableau pour les variables d'environnement.
L: Utilisé comme une liste à terminaison nulle des arguments utilisés dans le programme.
P: utilisé pour définir un chemin relatif. Si le chemin n'a pas de barre oblique dans sa valeur, le système utilise et recherche la variable d'environnement de chemin pour tout programme similaire.
V: agit comme un vecteur d'arguments à l'intérieur du programme.
Cartographie des descripteurs de fichiers
Dans frayer(), Nous pratiquons le fd_count et fd_map Arguments pour appeler les descripteurs de fichiers. Il spécifie quel enfant hériter.
Le numéro utilisé comme descripteur de fichier pour le processus de l'enfant dépend de son emplacement à l'intérieur du fd_map. Ici, nous considérerons l'exemple du parent avec des descripteurs de fichiers évalués 1, 3 et 5, puis le mappage sera quelque chose comme ceci:
>> int fd_map = 1, 3, 5;
Pour l'enfant | Pour le parent |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Notez que si vous utilisez l'explicite fd_map Pour faire correspondre ces descripteurs de fichiers avec l'enfant et le parent, vous devez ensuite mapper le SPWAN_FDCLOSE fonction pour procéder.
Drapeaux d'héritage
Dans Spawn, les utilisateurs doivent appeler l'un des drapeaux suivants en cas d'héritage. Quelques exemples de drapeaux d'apparition et leurs descriptions sont donnés ci-dessous:
Drapeau | Description |
---|---|
Spawn_align_default | Cet drapeau est utilisé pour configurer les paramètres par défaut de la configuration d'alignement. |
Spawn_align_fault | Ce drapeau est utilisé pour le désalignement des défauts des références de données. |
Spawn_align_nofault | Ce drapeau est utilisé pour réparer le désalignement des défauts. |
Spawn_debug | Ce drapeau est utilisé pour déboguer le noyau. |
Spawn_exec | Spawn agit comme exec * () en utilisant ce drapeau. |
Spawn_explicit_cpu | Cet drapeau est utilisé pour définir le masque de course et hériter du membre Mask = Run Mask. |
Spawn_explicit_sched | Ce drapeau est utilisé pour définir la stratégie de planification. |
Le <frayer.H> définit ce masque Spawn_align_mask utilisé pour aligner les drapeaux énumérés ci-dessus.
PID_T PGROUP | Le groupe de processus enfants si vous spécifiez le Spawn_setgroup dans le membre du drapeau. |
int runmask | Le massasque du processus enfant pour hériter des masques contenus en fonction de la valeur de ce membre. |
sigset_t sigmask | Le masque de signal pour le processus enfant qui est utilisé pour spécifier l'état des membres du drapeau. |
sigset_t sigdefault | L'ensemble des processus enfants des signaux par défaut. |
les erreurs
Le posix_spawn () et posix_spawnp () Les fonctions peuvent également échouer dans certains cas, comme les suivantes:
Einval: C'est le cas lorsque la valeur identifiée par file_actions ou attirer n'est pas correct et adéquat.
Lorsque l'appel sous-jacent de la fourche (2), de la fourche (2) ou du clone (2) échoue, le frayer() Les fonctions renverront un numéro d'erreur.
Enosys: C'est le cas si la fonction et son support ne sont pas inclus ou fournis dans un système.
Conclusion
Ce tutoriel a couvert les fonctionnalités de base fournies par Posix_spawn () et les fonctions utilisées par elle pour exécuter et exécuter ses fonctions. Nous avons également couvert les drapeaux et les erreurs couramment utilisés par Spawn.