Sous-routine posix_spawn ou posix_spawnp

Objectif

Génère un processus.

Syntaxe

int posix_spawn(pid_t *restrict pid, const char *restrict path,
       const posix_spawn_file_actions_t *file_actions,
       const posix_spawnattr_t *restrict attrp,
       char *const argv[restrict], char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
       const posix_spawn_file_actions_t *file_actions,
       const posix_spawnattr_t *restrict attrp,
       char *const argv[restrict], char * const envp[restrict]);

Descriptif

Les sous-routines posix_spawn et posix_spawnp créent un nouveau processus (processus enfant) à partir de l'image de processus spécifiée. La nouvelle image de processus est construite à partir d'un fichier exécutable standard appelé nouveau fichier image de processus.

Lorsqu'un programme C est exécuté à la suite de cet appel, le programme est entré comme un appel de fonction en langage C comme suit:
int main(int argc, char *argv[]);
argc est le nombre d'arguments et argv est un tableau de pointeurs de caractères vers les arguments eux-mêmes. En outre, la variable suivante:
extern char **environ;
est initialisé en tant que pointeur vers un tableau de pointeurs de caractères vers les chaînes d'environnement.

Le paramètre argv est un tableau de pointeurs de caractères vers des chaînes à terminaison nulle. Le dernier membre de ce tableau est un pointeur null et n'est pas compté dans argc. Ces chaînes constituent la liste d'arguments disponible pour la nouvelle image de processus. La valeur dans argv[ 0 ] doit désigner un nom de fichier associé à l'image de processus démarrée par la fonction posix_spawn ou posix_spawnp .

L'argument envp est un tableau de pointeurs de caractères vers des chaînes à terminaison nulle. Ces chaînes constituent l'environnement de la nouvelle image de processus. Le tableau d'environnement se termine par un pointeur null.

Le nombre d'octets disponibles pour les listes d'environnements et d'arguments combinés du processus enfant est {ARG_MAX}. L'implémentation indique dans la documentation système si une surcharge de liste, telle que des mots de longueur, des caractères de fin indéfinie, des pointeurs ou des octets d'alignement, est incluse dans ce total.

L'argument de chemin d'accès à posix_spawn est un nom de chemin qui identifie le nouveau fichier image de processus à exécuter.

Le paramètre de fichier posix_spawnp est utilisé pour construire un nom de chemin qui identifie le nouveau fichier image de processus. Si le paramètre de fichier contient une barre oblique (/), le paramètre de fichier est utilisé comme nom de chemin pour le nouveau fichier image de processus. Sinon, le préfixe de chemin de ce fichier est obtenu par une recherche dans les répertoires qui sont transmis en tant que variable d'environnement PATH. Si cette variable d'environnement n'est pas définie, les résultats de la recherche sont définis par l'implémentation.

Si file_actions est un pointeur null, les descripteurs de fichier qui sont ouverts dans le processus appelant restent ouverts dans le processus enfant, à l'exception de ceux dont l'indicateur FD_CLOEXEC est défini. Pour les descripteurs de fichier qui restent ouverts, tous les attributs des descriptions de fichier ouvert correspondantes, y compris les verrous de fichier, restent inchangés.

Si file_actions n'est pas un pointeur null, les descripteurs de fichier ouverts dans le processus enfant sont ceux ouverts dans le processus appelant tels que modifiés par l'objet actions de fichier de génération désigné par file_actions et l'indicateur FD_CLOEXEC de chaque descripteur de fichier ouvert restant après le traitement des actions de fichier de génération. L'ordre effectif de traitement des actions de fichier de génération est le suivant:
  1. L'ensemble des descripteurs de fichiers ouverts pour le processus enfant est initialement identique à l'ensemble ouvert pour le processus appelant. Tous les attributs des descriptions de fichiers ouverts correspondantes, y compris les verrouillages de fichiers, restent inchangés.
  2. Les actions par défaut du signal de masque de signal et les ID utilisateur et groupe effectifs pour le processus enfant sont modifiés comme indiqué dans l'objet d'attributs référencé par attrp.
  3. Les actions de fichier spécifiées par l'objet d'actions de fichier de génération sont effectuées dans l'ordre dans lequel elles ont été ajoutées à l'objet d'actions de fichier de génération.
  4. Tout descripteur de fichier dont l'indicateur FD_CLOEXEC est défini est fermé.
Le type d'objet Attributs de génération posix_spawnattr_t est défini dans le fichier d'en-tête spawn.h . Ses attributs sont définis comme suit:
  • Si l'indicateur POSIX_SPAWN_SETPGROUP est défini dans l'attribut spawn-flags de l'objet référencé par attrpet que l'attribut spawn-pgroup du même objet est différent de zéro, le groupe de processus de l'enfant est tel que spécifié dans l'attribut spawn-pgroup de l'objet référencé par attrp.
  • Dans un cas particulier, si l'indicateur POSIX_SPAWN_SETPGROUP est défini dans l'attribut spawn-flags de l'objet référencé par attrpet que l'attribut spawn-pgroup du même objet est défini sur 0, l'enfant se trouve dans un nouveau groupe de processus avec un ID de groupe de processus égal à son ID de processus.
  • Si l'indicateur POSIX_SPAWN_SETPGROUP n'est pas défini dans l'attribut spawn-flags de l'objet référencé par attrp, le nouveau processus enfant hérite du groupe de processus du parent.
  • Si l'indicateur POSIX_SPAWN_SETSCHEDPARAM est défini dans l'attribut spawn-flags de l'objet référencé par attrp, mais que POSIX_SPAWN_SETSCHEDULER n'est pas défini, la nouvelle image de processus possède initialement la règle de planification du processus appelant avec les paramètres de planification spécifiés dans l'attribut spawn-schedparam de l'objet référencé par attrp.
  • Si l'indicateur POSIX_SPAWN_SETSCHEDULER est défini dans l'attribut spawn-flags de l'objet référencé par attrp (quelle que soit la valeur de l'indicateur POSIX_SPAWN_SETSCHEDPARAM ), la nouvelle image de processus possède initialement la règle de planification spécifiée dans l'attribut spawn-schedpolicy de l'objet référencé par attrp et les paramètres de planification spécifiés dans l'attribut spawn-schedparam du même objet.
  • L'indicateur POSIX_SPAWN_RESETIDS dans l'attribut spawn-flags de l'objet référencé par attrp régit l'ID utilisateur effectif du processus enfant. Si cet indicateur n'est pas défini, le processus enfant hérite de l'ID utilisateur effectif du processus parent. Si cet indicateur est défini, l'ID utilisateur effectif du processus enfant est réinitialisé sur l'ID utilisateur réel du parent. Dans les deux cas, si le bit de mode set-user-ID du nouveau fichier image de processus est défini, l'ID utilisateur effectif du processus enfant devient l'ID propriétaire du fichier avant que l'exécution de la nouvelle image de processus ne commence.
  • L'indicateur POSIX_SPAWN_RESETIDS dans l'attribut spawn-flags de l'objet référencé par attrp régit également l'ID de groupe effectif du processus enfant. Si cet indicateur n'est pas défini, le processus enfant hérite de l'ID de groupe effectif du processus parent. Si cet indicateur est défini, l'ID de groupe effectif du processus enfant est réinitialisé sur l'ID de groupe réel du parent. Dans les deux cas, si le bit de mode set-group-ID du nouveau fichier image de processus est défini, l'ID de groupe effectif du processus enfant devient l'ID de groupe de ce fichier avant que l'exécution de la nouvelle image de processus ne commence.
  • Si l'indicateur POSIX_SPAWN_SETSIGMASK est défini dans l'attribut spawn-flags de l'objet référencé par attrp, le processus enfant possède initialement le masque de signal spécifié dans l'attribut spawn-sigmask de l'objet référencé par attrp.
  • Si l'indicateur POSIX_SPAWN_SETSIGDEF est défini dans l'attribut spawn-flags de l'objet référencé par attrp, les signaux spécifiés dans l'attribut spawn-sigdefault du même objet sont définis sur leurs actions par défaut dans le processus enfant. Les signaux définis sur l'action par défaut dans le processus parent sont définis sur l'action par défaut dans le processus enfant. Les signaux définis pour être interceptés par le processus appelant sont définis sur l'action par défaut dans le processus enfant.
  • A l'exception de SIGCHLD, les signaux définis pour être ignorés par l'image du processus appelant sont définis pour être ignorés par le processus enfant, sauf indication contraire de l'indicateur POSIX_SPAWN_SETSIGDEF défini dans l'attribut spawn-flags de l'objet référencé par attrp et des signaux indiqués dans l'attribut spawn-sigdefault de l'objet référencé par attrp.
  • Si le signal SIGCHLD est défini pour être ignoré par le processus appelant, il n'est pas spécifié si le signal SIGCHLD est défini pour être ignoré ou défini sur l'action par défaut dans le processus enfant. Ceci est vrai sauf indication contraire de l'indicateur POSIX_SPAWN_SETSIGDEF défini dans l'attribut spawn_flags de l'objet référencé par attrp et du signal SIGCHLD indiqué dans l'attribut spawn_sigdefault de l'objet référencé par attrp.
  • Si l'indicateur POSIX_SPAWN_NO_SHM est défini dans l'attribut spawn-flags de l'objet référencé par le pointeur attrp , la nouvelle image de processus n'hérite pas de la mémoire partagée.
  • Si la valeur du pointeur attrp est NULL, les valeurs par défaut sont utilisées.
Tous les attributs de processus, autres que ceux influencés par les attributs définis dans l'objet référencé par attrp dans la liste précédente ou par les manipulations de descripteur de fichier spécifiées dans file_actions, sont affichés dans la nouvelle image de processus comme si fork avait été appelé pour créer un processus enfant, puis qu'un membre de la famille de fonctions exec avait été appelé par le processus enfant pour exécuter la nouvelle image de processus.

Si les pointeurs file_actions et attrp sont NULL, les gestionnaires de bifurcation ne sont pas appelés avant la création du nouveau processus. En outre, les gestionnaires de bifurcation ne sont pas appelés si l'indicateur POSIX_SPAWN_NO_FORK_HANDLERS est spécifié dans l'attribut spawn-flags et que l'indicateur POSIX_SPAWN_FORK_HANDLER n'est pas spécifié. Sinon, les gestionnaires de bifurcation sont appelés.

Valeurs renvoyées

Une fois l'opération terminée, posix_spawn et posix_spawnp renvoient l'ID de processus du processus enfant au processus parent, dans la variable indiquée par un argument pid non NULL, et renvoient 0 comme valeur de retour de la fonction. Sinon, aucun processus enfant n'est créé, la valeur qui est stockée dans la variable pointée par un pid non NULL n'est pas spécifiée et un numéro d'erreur est renvoyé en tant que valeur de retour de la fonction pour indiquer l'erreur. Si l'argument pid est un pointeur null, l'ID de processus de l'enfant n'est pas renvoyé à l'appelant.

Codes d'erreur

Les sous-routines posix_spawn et posix_spawnp échouent si les conditions suivantes sont remplies:
Tableau 1. Codes d'erreur
Article Descriptif
EINVAL La valeur indiquée par file_actions ou attrp n'est pas valide.
Les codes d'erreur des sous-routines posix_spawn et posix_spawnp sont affectés par les conditions suivantes:
  • Si cette erreur se produit après le retour réussi du processus appelant à partir de la fonction posix_spawn ou posix_spawnp , le processus enfant peut se fermer avec le statut de sortie 127.
  • Si posix_spawn ou posix_spawnp échoue pour l'une des raisons qui provoquerait l'échec de fork ou de l'une des fonctions de la famille exec , une valeur d'erreur est renvoyée, comme décrit respectivement par fork et exec(ou, si l'erreur se produit après le retour du processus appelant, le processus enfant se ferme avec le statut de sortie 127).
  • Si POSIX_SPAWN_SETPGROUP est défini dans l'attribut spawn-flags de l'objet référencé par attrpet que posix_spawn ou posix_spawnp échoue lors de la modification du groupe de processus de l'enfant, une valeur d'erreur est renvoyée comme décrit par setpgid (ou, si l'erreur se produit après le retour du processus appelant, le processus enfant doit se fermer avec le statut de sortie 127).
  • Si POSIX_SPAWN_SETSCHEDPARAM est défini et que POSIX_SPAWN_SETSCHEDULER n'est pas défini dans l'attribut spawn-flags de l'objet référencé par attrp, si posix_spawn ou posix_spawnp échoue pour l'une des raisons qui provoquerait l'échec de sched_setparam , une valeur d'erreur est renvoyée comme décrit par sched_setparam (ou, si l'erreur se produit après le retour du processus appelant, le processus enfant sexit avec le statut de sortie 127).
  • Si POSIX_SPAWN_SETSCHEDULER est défini dans l'attribut spawn-flags de l'objet référencé par attrp, et si posix_spawn ou posix_spawnp échoue pour l'une des raisons qui provoquerait l'échec de sched_setscheduler , une valeur d'erreur est renvoyée comme décrit par sched_setscheduler (ou, si l'erreur se produit après le retour du processus appelant, le processus enfant se ferme avec le statut de sortie 127).
  • Si l'argument file_actions n'est pas NULL et spécifie des actions close, dup2ou open à exécuter, et si posix_spawn ou posix_spawnp échoue pour l'une des raisons qui provoquerait l'échec de close, dup2ou open , une valeur d'erreur est renvoyée, comme décrit respectivement par close, dup2et open(ou, si l'erreur se produit après le renvoi réussi du processus d'appel, le processus enfant se ferme avec le statut de sortie 127). Une action d'ouverture de fichier peut, à elle seule, entraîner l'une des erreurs décrites par close ou dup2, en plus de celles décrites par open.