.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2009 Bill O. Gallmeister (bgallmeister@gmail.com) .\" and Copyright 2010 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" References consulted: .\" Linux glibc source code .\" POSIX 1003.1-2004 documentation .\" (http://www.opengroup.org/onlinepubs/009695399) .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH POSIX_SPAWN 3 "1 novembre 2020" GNU "Manuel du programmeur Linux" .SH NOM posix_spawn, posix_spawnp \- Engendrer un processus .SH SYNOPSIS .nf \fB#include \fP .PP \fBint posix_spawn(pid_t *\fP\fIpid\fP\fB, const char *\fP\fIpath\fP\fB,\fP \fB const posix_spawn_file_actions_t *\fP\fIfile_actions\fP\fB,\fP \fB const posix_spawnattr_t *\fP\fIattrp\fP\fB,\fP \fB char *const \fP\fIargv[]\fP\fB, char *const \fP\fIenvp[]\fP\fB);\fP .PP \fBint posix_spawnp(pid_t *\fP\fIpid\fP\fB, const char *\fP\fIfile\fP\fB,\fP \fB const posix_spawn_file_actions_t *\fP\fIfile_actions\fP\fB,\fP \fB const posix_spawnattr_t *\fP\fIattrp\fP\fB,\fP \fB char *const \fP\fIargv[]\fP\fB, char *const \fP\fIenvp[]\fP\fB);\fP .fi .SH DESCRIPTION Les fonctions \fBposix_spawn\fP() et \fBposix_spawnp\fP() sont utilisées pour créer un processus enfant qui exécute le fichier indiqué. Ces fonctions sont spécifiées par POSIX pour fournir une méthode standard de création de nouveaux processus sur les machines n'ayant pas la capacité de prendre l'appel système \fBfork\fP(2) en charge. Ces machines sont en général de petits systèmes embarqués sans MMU. .PP Les fonctions \fBposix_spawn\fP() et \fBposix_spawnp\fP() fournissent les fonctionnalités de \fBfork\fP(2) et \fBexec\fP(3) combinées, complétées par des étapes facultatives de nettoyage dans l'enfant avant l'appel à \fBexec\fP(3). Ces fonctions n'ont pas vocation à remplacer les appels systèmes \fBfork\fP(2) et \fBexecve\fP(2). En fait, elles ne fournissent qu'un sous\-ensemble des fonctionnalités qui peuvent être réalisées par ces appels systèmes. .PP La seule différence entre \fBposix_spawn\fP() et \fBposix_spawnp\fP() est la manière avec laquelle elles spécifient le fichier devant être exécuté par le processus enfant. Avec \fBposix_spawn\fP(), le fichier exécutable est indiqué par un chemin (absolu ou relatif). Avec \fBposix_spawnp\fP(), le fichier exécutable n'est indiqué que par un nom de fichier et le système le cherche dans la liste des répertoires indiqués dans \fBPATH\fP (de la même façon que \fBexecvp\fP(3)). Le reste de cette page est écrit du point de vue de \fBposix_spawn\fP() et il est à garder en mémoire que \fBposix_spawnp\fP() ne diffère que par le point qui vient d'être décrit. .PP Les arguments restants de ces fonctions sont comme suit\ : .IP * 3 L'argument \fIpid\fP pointe vers un tampon utilisé pour retourner l'identifiant du nouveau processus enfant. .IP * L'argument \fIfile_action\fP pointe vers un \fIobjet d'actions sur fichier\fP qui indique les actions en lien avec des fichiers devant être effectuées par l'enfant entre les étapes \fBfork\fP(2) et \fBexec\fP(3). Cet objet est initialisé et rempli avant l'appel à \fBposix_spawn\fP() par un appel aux fonctions \fBposix_spawn_file_actions_init\fP(3) et \fBposix_spawn_file_actions_*\fP(). .IP * L'argument \fIattrp\fP pointe vers un \fIobjet d'attributs\fP qui spécifie divers attributs du processus enfant créé. Cet objet est initialisé et rempli avant l'appel à \fBposix_spawn\fP() par un appel aux fonctions \fBposix_spawnattr_init\fP(3) et \fBposix_spawnattr_*\fP(). .IP * Les arguments \fIargv\fP et \fIenvp\fP indiquent la liste des arguments ainsi que l'environnement du programme qui doit être exécuté dans le processus enfant, de la même façon que \fBexecve\fP(2). .PP Ci\-dessous, les fonctions sont décrites selon une méthode en trois étapes\ : \fBfork\fP(), pré\-\fBexec\fP() (exécuté dans l'enfant) et \fBexec\fP() (exécuté dans l'enfant). .SS "L’étape fork()" Depuis la glibc\ 2.24, la fonction \fBposix_spawn\fP() commence par appeler \fBclone\fP(2) avec les drapeaux \fBCLONE_VM\fP et \fBCLONE_VFORK\fP. Les implémentations plus anciennes utilisent \fBfork\fP(2) ou même \fBvfork\fP(2) (voir ci\-dessous). .PP L'identifiant du nouveau processus enfant est placé dans \fI*pid\fP. La fonction \fBposix_spawn\fP() rend alors la main au processus appelant. .PP Ensuite, le parent peut utiliser l'un des appels système décrits dans \fBwait\fP(2) pour vérifier l’état du processus enfant. Si l'enfant échoue dans n'importe laquelle des étapes de nettoyage décrites ci\-dessous ou n'arrive pas à exécuter le fichier indiqué, il retourne avec un état\ 127. .PP Avant la glibc\ 2.24, le processus enfant est créé avec \fBvfork\fP(2) au lieu de \fBfork\fP(2) lorsqu'une des conditions suivantes est remplie\ : .IP * 3 l'élément \fIspawn\-flags\fP de l'objet d'attributs sur lequel \fIattrp\fP pointe contient le drapeau \fBPOSIX_SPAWN_USEVFORK\fP spécifique à GNU\ ; ou .IP * \fIfile_actions\fP est NULL et l'élément \fIspawn\-flags\fP de l'objet d'attributs sur lequel pointe \fIattrp\fP ne contient \fIpas\fP \fBPOSIX_SPAWN_SETSIGMASK\fP, \fBPOSIX_SPAWN_SETSIGDEF\fP, \fBPOSIX_SPAWN_SETSCHEDPARAM\fP, \fBPOSIX_SPAWN_SETSCHEDULER\fP, \fBPOSIX_SPAWN_SETPGROUP\fP ou \fBPOSIX_SPAWN_RESETIDS\fP. .PP En d'autres termes, \fBvfork\fP(2) est utilisée si l'appelant le demande ou si aucun nettoyage n'est attendu dans l'enfant avant qu'il n'\fBexec\fP(3)ute le fichier demandé. .PP .SS "L’étape pré\-exec() : nettoyage" Entre les étapes \fBfork\fP() et \fBexec\fP(), un processus enfant peut avoir à effectuer un ensemble d'actions de nettoyage. Les fonctions \fBposix_spawn\fP() et \fBposix_spawnp\fP() prennent en charge un ensemble, petit et bien déterminé, de tâches système que l'enfant peut accomplir avant d'exécuter le fichier exécutable. Ces opérations sont contrôlées par l'objet d'attributs sur lequel \fIattrp\fP pointe et l'objet d'actions sur fichier sur lequel \fIfile_actions\fP pointe. Dans l'enfant, le traitement est fait dans l'ordre suivant\ : .IP 1. 3 Actions d'attributs de processus\ : masque de signaux, gestionnaires de signaux par défaut, algorithme d'ordonnancement et paramètres, groupe du processus, et les identifiants d'utilisateur et de groupe effectifs sont changés comme indiqué dans l'objet d'attributs vers lequel \fIattrp\fP pointe. .IP 2. Les actions sur fichier, telles qu'indiquées dans l'argument \fIfile_action\fP, sont effectuées dans l'ordre dans lequel elles ont été spécifiées par les appels aux fonctions \fBposix_spawn_file_actions_add*\fP(). .IP 3. Les descripteurs de fichiers avec le drapeau \fBFD_CLOEXEC\fP sont fermés. .PP Tous les attributs de processus de l'enfant, autres que ceux affectés par les attributs indiqués dans l'objet vers lequel \fIattrp\fP pointe et par les actions sur fichier indiquées dans l'objet vers lequel \fIfile_actions\fP pointe, seront affectés comme si l'enfant avait été créé par \fBfork\fP(2) et que le programme avait été exécuté par \fBexecve\fP(2). .PP Les actions d'attributs de processus sont définies par l'objet d'attributs vers lequel \fIattrp\fP pointe. L'attribut \fIspawn\-flags\fP (indiqué par un appel à \fBposix_spawnattr_setflags\fP(3)) contrôle les actions globales effectuées, et les autres attributs de l'objet déterminent les valeurs utilisées durant ces actions. .PP Les effets des drapeaux qui peuvent être indiqués dans \fIspawn\-flags\fP sont les suivants\ : .TP \fBPOSIX_SPAWN_SETSIGMASK\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setsigmask (3)) Fixe le masque de signaux à l'ensemble donné dans l'attribut \fIspawn\-sigmask\fP de l'objet vers lequel \fIattrp\fP pointe. Si le drapeau \fBPOSIX_SPAWN_SETSIGMASK\fP n'est pas levé, alors l'enfant hérite du masque de signaux de son parent. .TP \fBPOSIX_SPAWN_SETSIGDEF\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setsigdefault (3)) Réétablit la disposition de tous les signaux indiqués dans l'attribut \fIspawn\-sigdefault\fP de l'objet vers lequel \fIattrp\fP pointe à la valeur par défaut. Pour le traitement des dispositions de signaux non spécifiées dans l'attribut \fIspawn\-sigdefault\fP ou le traitement lorsque \fBPOSIX_SPAWN_SETSIGDEF\fP n'est pas spécifié, consultez \fBexecve\fP(2). .TP \fBPOSIX_SPAWN_SETSCHEDPARAM\fP .\" (POSIX_PRIORITY_SCHEDULING only) .\" FIXME . .\" (see .\" .BR posix_spawnattr_setschedparam (3)) Si ce drapeau est levé et que le drapeau \fBPOSIX_SPAWN_SETSCHEDULER\fP n'est pas levé, fixer alors les paramètres de l'ordonnanceur aux paramètres définis dans l'attribut \fIspawn\-schedparam\fP de l'objet sur lequel \fIattrp\fP pointe. .TP \fBPOSIX_SPAWN_SETSCHEDULER\fP Fixe l'algorithme de stratégie d'ordonnancement et les paramètres de l'enfant comme suit\ : .RS .IP * 3 .\" FIXME . .\" (see .\" .BR posix_spawnattr_setpolicy (3)) La stratégie d'ordonnancement est réglée à la valeur indiquée dans l'attribut \fIspawn\-schedpolicy\fP de l'objet sur lequel \fIattrp\fP pointe. .IP * .\" FIXME . .\" (see .\" .BR posix_spawnattr_setschedparam (3)) Les paramètres de l'ordonnanceur sont fixés à la valeur indiquée dans l'attribut \fIspawn\-schedparam\fP de l'objet sur lequel \fIattrp\fP pointe (mais voir la section BOGUES). .PP Si les drapeaux \fBPOSIX_SPAWN_SETSCHEDPARAM\fP et \fBPOSIX_SPAWN_SETSCHEDPOLICY\fP ne sont pas spécifiés, l'enfant hérite du parent les attributs correspondants de l'ordonnanceur. .RE .TP \fBPOSIX_SPAWN_RESETIDS\fP Si le drapeau est levé, réinitialiser les UID et GID effectifs aux UID et GID réels du processus parent. Si ce drapeau n'est pas indiqué, alors l'enfant conserve les UID et GID effectifs du processus parent. Dans les deux cas, si les bits de permission set\-user\-ID et set\-group\-ID sont activés sur le fichier exécutable, leur effet surcharge la valeur des UID et GID effectifs (voir \fBexecve\fP(2)). .TP \fBPOSIX_SPAWN_SETPGROUP\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setpgroup (3)) Fixer le groupe du processus à la valeur indiquée dans l'attribut \fIspawn\-pgroup\fP de l'objet sur lequel \fIattrp\fP pointe. Si l'attribut \fIspawn\-pgroup\fP à une valeur de\ 0, l'identifiant de groupe du processus enfant est rendu identique à l'identifiant de processus. Si le drapeau \fBPOSIX_SPAWN_SETPGROUP\fP n'est pas levé, l'enfant hérite de l'identifiant de groupe du processus parent. .TP \fBPOSIX_SPAWN_USEVFORK\fP Depuis la version\ 2.24 de la glibc, ce drapeau n'a aucun effet. Sur des implémentations plus anciennes, lever ce drapeau force l’étape \fBfork()\fP à utiliser \fBvfork\fP(2) à la place de \fBfork\fP(2). La macro de test de fonctionnalités \fB_GNU_SOURCE\fP doit être définie pour obtenir une définition de cette constante. .TP \fBPOSIX_SPAWN_SETSID\fP (depuis la glibc\ 2.26) .\" This flag has been accepted in POSIX, see: .\" http://austingroupbugs.net/view.php?id=1044 .\" and has been implemented in glibc since version 2.26 .\" commit daeb1fa2e1b33323e719015f5f546988bd4cc73b Si ce drapeau est levé, le processus enfant doit créer une nouvelle session et devenir le responsable de cette session. Le processus enfant doit aussi devenir le responsable du nouveau groupe du processus de la session (voir \fBsetid\fP(2)). La macro de test de fonctionnalités \fB_GNU_SOURCE\fP doit être définie pour obtenir la définition de cette constante. .PP .\" mtk: I think we probably don't want to say the following, since it .\" could lead people to do the wrong thing .\" The POSIX standard tells you to call .\" this function to de-initialize the attributes object pointed to by .\" .I attrp .\" when you are done with it; .\" however, on Linux systems this operation is a no-op. Si \fIattrp\fP est NULL, alors les comportements par défaut décrits plus haut pour chaque drapeau s'appliquent. .PP L'argument \fIfile_actions\fP indique une séquence d'opérations sur fichier effectuées dans le processus enfant après le traitement général décrit plus haut et avant de faire l’étape \fBexec\fP(). Si \fBfile_actions\fP est NULL, aucune action spécifique n'est effectuée et la sémantique standard de \fBexec\fP(3) s'applique\ : les descripteurs de fichier ouverts avant \fBexec\fP() restent ouverts dans le nouveau processus à l'exception de ceux pour lesquels le drapeau \fBFD_CLOEXEC\fP a été levé. Les verrous de fichier restent en place. .PP .\" FIXME . I think the following is best placed in the .\" posix_spawn_file_actions_adddup2(3) page, and a similar statement is .\" also needed in posix_spawn_file_actions_addclose(3) .\" Note that you can specify file descriptors in .\" .I posix_spawn_file_actions_adddup2 (3) .\" which would not be usable if you called .\" .BR dup2 (2) .\" at that time--i.e., file descriptors that are opened or .\" closed by the earlier operations .\" added to .\" .I file_actions . Si \fIfile_actions\fP n'est pas NULL, il contient un ensemble ordonné de demandes pour exécuter \fBopen\fP(2), \fBclose\fP(2) et \fBdup2\fP() sur des fichiers \&. Ces requêtes sont ajoutées à \fIfile_actions\fP par \fBposix_spawn_file_actions_addopen\fP(3), \fBposix_spawn_file_actions_addclose\fP(3) et \fBposix_spawn_file_actions_adddup2\fP(3). Les opérations demandées sont effectuées dans l'ordre dans lequel elles ont été ajoutées à \fIfile_actions\fP. .PP Si une des actions de nettoyage échoue (à cause de mauvaises valeurs ou pour toute autre raison pour laquelle la gestion de signaux, l'ordonnancement de processus, les fonctions d'identifiant de groupe de processus ou d'opérations de descripteur de fichier peuvent échouer), le processus enfant termine avec un code de retour de 127. .SS "L’étape exec()" Une fois que l'enfant s'est dédoublé sans erreur et a exécuté toutes les étapes \fBpré\-exec\fP(), l'enfant lance l'exécutable souhaité. .PP Le processus enfant récupère son environnement depuis l'argument \fIenvp\fP, analysé comme si \fBexecve\fP(2) avait été appelé avec. Les arguments du processus créé viennent de l'argument \fIargv\fP, analysé comme pour \fBexecve\fP(2). .SH "VALEUR RENVOYÉE" En cas de succès, \fBposix_spawn\fP() et \fBposix_spawnp\fP() placent l'identifiant du processus enfant dans \fIpid\fP et renvoient \fB0\fP. En cas d'erreur lors de l’étape \fBfork()\fP, aucun enfant n'est créé, le contenu de \fI*pid\fP n'est pas défini et ces fonctions renvoient un code d'erreur comme décrit plus bas. .PP Même lorsque ces fonctions renvoient un état de réussite, le processus enfant peut encore échouer pour une pléthore de raisons liées au \fBpré\-exec\fP(). De plus, \fBexec\fP(3) peut échouer. Dans tous ces cas, le processus enfant termine avec 127 comme code de retour. .SH ERREURS Les fonctions \fBposix_spawn\fP() et \fBposix_spawnp\fP() n'échouent que dans le cas où l'appel sous\-jacent à \fBfork\fP(2), \fBvfork\fP(2) ou \fBclone\fP(2) échoue. Dans ces cas, ces fonctions renvoient un code d'erreur correspondant aux erreurs décrites pour \fBfork\fP(2), \fBvfork\fP(2) ou \fBclone\fP(2). .PP De plus, ces fonction échouent si\ : .TP \fBENOSYS\fP Fonction non prise en charge sur ce système. .SH VERSIONS Les fonctions \fBposix_spawn\fP() et \fBposix_spawnp\fP() sont disponibles depuis la version\ 2.2 de la glibc. .SH CONFORMITÉ .\" FIXME . This piece belongs in spawnattr_setflags(3) .\" The .\" .B POSIX_SPAWN_USEVFORK .\" flag is a GNU extension; the .\" .B _GNU_SOURCE .\" feature test macro must be defined (before including any header files) .\" to obtain the definition of this constant. POSIX.1\-2001, POSIX.1\-2008. .SH NOTES Les activités de nettoyage dans l'enfant sont contrôlées par les objets sur lesquels \fIattrp\fP pointe (pour les actions n'agissant pas sur des fichiers) et \fIfile_actions\fP. Dans le jargon POSIX, les types de données \fIposix_spawnattr_t\fP et \fIposix_spawn_file_actions_t\fP sont évoqués comme des objets et leurs éléments ne sont pas spécifiés par des noms. Les programmes portables doivent initialiser ces objets par l'appel aux fonctions spécifiées par POSIX uniquement. En d'autres termes, bien que ces objets puissent être implémentés avec des structures contenant des champs, les programmes portables doivent éviter toute dépendance à de tels détails d'implémentation. .PP .\" Tested on glibc 2.12 Selon POSIX, il n'est pas déterminé si les gestionnaires de dédoublement établis avec \fBpthread_atfork\fP(3) sont appelés lorsque \fBposix_spawn\fP() est appelée. Depuis la version\ 2.24 de la glibc, les gestionnaires de dédoublement ne sont jamais exécutés. Sur des implémentations plus anciennes, les gestionnaires de dédoublement ne sont appelés que si l'enfant est créé avec \fBfork\fP(2). .PP Il n'existe pas de fonction «\ posix_fspawn\ » (c'est\-à\-dire une fonction qui serait à \fBposix_spawn\fP() ce que \fBfexecve\fP(3) est à \fBexecve\fP(2)). Cependant, cette fonctionnalité peut être obtenue en spécifiant l'argument \fIpath\fP comme l'un des fichiers dans le répertoire \fI/proc/self/fd\fP de l'appelant. .SH BOGUES .\" http://sourceware.org/bugzilla/show_bug.cgi?id=12052 POSIX.1 spécifie que lorsque \fBPOSIX_SPAWN_SETSCHEDULER\fP est indiqué dans \fIspawn\-flags\fP, alors \fBPOSIX_SPAWN_SETSCHEDPARAM\fP est ignoré s'il est présent. Cependant, avant la version\ 2.14 de la glibc, les appels à \fBposix_spawn\fP() échouent avec une erreur si \fBPOSIX_SPAWN_SETSCHEDULER\fP est indiqué sans que \fIPOSIX_SPAWN_SETSCHEDPARAM\fP ne le soit également. .SH EXEMPLES Le programme suivant illustre l'utilisation de plusieurs fonctions de l'API spawn de POSIX. Le programme accepte des attributs en ligne de commande qui peuvent être utilisés pour créer des objets d'actions sur fichier ou d'attributs. Les arguments de la ligne de commande restants sont utilisés comme nom de l'exécutable et comme arguments de ligne de commande du programme exécuté dans l'enfant. .PP Dans la première invocation, la commande \fBdate\fP(1) est exécutée dans l'enfant et l'appel à \fBposix_spawn\fP() n'utilise pas d'objets d'actions sur fichier ou d'attributs. .PP .in +4n .EX $ \fB./a.out date\fP PID de l'enfant : 7634 Tue Feb 1 19:47:50 CEST 2011 État de l'enfant : terminé, statut=0 .EE .in .PP Dans la deuxième invocation, l'option en ligne de commande \fI\-c\fP est utilisée pour créer un objet d'actions sur fichier qui ferme la sortie standard dans l'enfant. Par la suite, \fBdate\fP(1) échoue lors d'une tentative d'écriture et termine avec un état\ \fB1\fP. .PP .in +4n .EX $ \fB./a.out \-c date\fP PID de l'enfant\ : 7636 date : erreur d'écriture : Mauvais descripteur de fichier État de l'enfant : terminé, état=1 .EE .in .PP Dans l'invocation suivante, l'option en ligne de commande \fI\-s\fP est utilisée pour créer un objet d'attributs qui indique que tous les signaux (blocables) doivent être bloqués dans l'enfant. Par la suite, une tentative de tuer l'enfant par le signal par défaut envoyé par \fBkill\fP(1) (c'est\-à\-dire \fBSIGTERM\fP) échoue car ce signal est bloqué. Par conséquent, il est nécessaire d'utiliser \fBSIGKILL\fP pour tuer l'enfant (car \fBSIGKILL\fP ne peut être bloqué). .PP .in +4n .EX $ \fB./a.out \-s sleep 60 &\fP [1] 7637 $ PID de l'enfant : 7638 $ \fBkill 7638\fP $ \fBkill \-KILL 7638\fP $ État de l'enfant : tué par le signal 9 [1]+ Fait ./a.out \-s sleep 60 .EE .in .PP Lorsque l'enfant tente d'exécuter une commande qui n'existe pas, l'appel à \fBexec\fP(3) échoue et l'enfant termine avec un état\ 127. .PP .in +4n .EX $ \fB./a.out xxxxx PID de l'enfant : 10190 Statut de l'enfant : terminé, état=127\fP .EE .in .SS "Source du programme" \& .EX #include #include #include #include #include #include #include #include #define errExit(msg) do { perror(msg); \e exit(EXIT_FAILURE); } while (0) #define errExitEN(en, msg) \e do { errno = en; perror(msg); \e exit(EXIT_FAILURE); } while (0) char **environ; int main(int argc, char *argv[]) { pid_t child_pid; int s, opt, status; sigset_t mask; posix_spawnattr_t attr; posix_spawnattr_t *attrp; posix_spawn_file_actions_t file_actions; posix_spawn_file_actions_t *file_actionsp; /* Lire les options de la ligne de commande pouvant être utilisées pour indiquer un objet d'attributs et un objet d'actions sur fichier pour l'enfant. */ attrp = NULL; file_actionsp = NULL; while ((opt = getopt(argc, argv, "sc")) != \-1) { switch (opt) { case \(aqc\(aq: /* \-c: fermer la sortie standard dans l'enfant */ /* Créer un objet d'actions de fichier et lui ajouter une action "fermer". */ s = posix_spawn_file_actions_init(&file_actions); if (s != 0) errExitEN(s, "posix_spawn_file_actions_init"); s = posix_spawn_file_actions_addclose(&file_actions, STDOUT_FILENO); if (s != 0) errExitEN(s, "posix_spawn_file_actions_addclose"); file_actionsp = &file_actions; break; case \(aqs\(aq: /* \-s: bloquer tous les signaux dans l'enfant */ /* Créer un objet d'attributs et lui ajouter une action "établir un masque de signaux". */ s = posix_spawnattr_init(&attr); if (s != 0) errExitEN(s, "posix_spawnattr_init"); s = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK); if (s != 0) errExitEN(s, "posix_spawnattr_setflags"); sigfillset(&mask); s = posix_spawnattr_setsigmask(&attr, &mask); if (s != 0) errExitEN(s, "posix_spawnattr_setsigmask"); attrp = &attr; break; } } /* Créer l'enfant. Le nom du programme à exécuter et les arguments de la ligne de commande sont récupérés dans les arguments de la ligne de commande de ce programme. L'environnement du programme exécuté dans l'enfant est identique à l'environnement du parent. */ s = posix_spawnp(&child_pid, argv[optind], file_actionsp, attrp, &argv[optind], environ); if (s != 0) errExitEN(s, "posix_spawn"); /* Détruire tout objet créé précédemment. */ if (attrp != NULL) { s = posix_spawnattr_destroy(attrp); if (s != 0) errExitEN(s, "posix_spawnattr_destroy"); } if (file_actionsp != NULL) { s = posix_spawn_file_actions_destroy(file_actionsp); if (s != 0) errExitEN(s, "posix_spawn_file_actions_destroy"); } printf("PID de l'enfant : %jd\en", (intmax_t) child_pid); /* Observer l’état de l'enfant jusqu'à son arrêt. */ do { s = waitpid(child_pid, &status, WUNTRACED | WCONTINUED); if (s == \-1) errExit("waitpid"); printf("Statut de l'enfant\ : "); if (WIFEXITED(status)) { printf("terminé, état=%d\en", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("tué par le signal %d\en", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("arrêté par le signal %d\en", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("reprise\en"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" .\" Disable hyphenation .nh .ad l \fBclose\fP(2), \fBdup2\fP(2), \fBexecl\fP(2), \fBexeclp\fP(2), \fBfork\fP(2), \fBopen\fP(2), \fBsched_setparam\fP(2), \fBsched_setscheduler\fP(2), \fBsetpgid\fP(2), \fBsetuid\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBposix_spawn_file_actions_addclose\fP(3), \fBposix_spawn_file_actions_adddup2\fP(3), \fBposix_spawn_file_actions_addopen\fP(3), \fBposix_spawn_file_actions_destroy\fP(3), \fBposix_spawn_file_actions_init\fP(3), \fBposix_spawnattr_destroy\fP(3), \fBposix_spawnattr_getflags\fP(3), \fBposix_spawnattr_getpgroup\fP(3), \fBposix_spawnattr_getschedparam\fP(3), \fBposix_spawnattr_getschedpolicy\fP(3), \fBposix_spawnattr_getsigdefault\fP(3), \fBposix_spawnattr_getsigmask\fP(3), \fBposix_spawnattr_init\fP(3), \fBposix_spawnattr_setflags\fP(3), \fBposix_spawnattr_setpgroup\fP(3), \fBposix_spawnattr_setschedparam\fP(3), \fBposix_spawnattr_setschedpolicy\fP(3), \fBposix_spawnattr_setsigdefault\fP(3), \fBposix_spawnattr_setsigmask\fP(3), \fBpthread_atfork\fP(3), \fI\fP, Base Definitions volume of POSIX.1\-2001, \fIhttp://www.opengroup.org/unix/online.html\fP .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Grégoire Scano . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .