Sous-routine exec, execl, execle, execlp, execv, execve, execvp, exect ou fexecve
Objectif
Exécute un fichier.
Bibliothèque
Bibliothèque C standard (libc.a)
Syntaxe
#include <unistd.h> extern
char **environ; int execl (
Path,
Argument0 [, Argument1, ...], 0)
const char *Path, *Argument0, *Argument
1, ...;int execle (
Path,
Argument0 [, Argument1, ...], 0,
EnvironmentPointer)
const
char *Path, *Argument0, *Argum
ent
1, ...;
char *const EnvironmentPointer[ ]; int execlp (
File,
Argument0 [, Argument1
, ...], 0)
const char *File, *Argument0, *Argument
1, ...; int execv (
Path,
ArgumentV)
const char *Path;
char *const ArgumentV[ ];int execve (
Path,
ArgumentV,
EnvironmentPointer)
const char *Path;
char
*const ArgumentV[ ], *EnvironmentPointer
[ ];int execvp (
File,
ArgumentV)
const char *File;
char *const ArgumentV[ ]; int exect (
Path,
ArgumentV,
EnvironmentPointer)
char *Path, *ArgumentV, *EnvironmentPointer [ ];int fexecve (FileDescriptor, ArgumentV, EnvironmentPointer)
int FileDescriptor;
char *const ArgumentV[ ], *EnvironmentPointer[ ]; Descriptif
Sous toutes ses formes, le sous-programme Exec exécute un nouveau programme dans le processus appelant. Le sous-programme Exec ne crée pas de processus, mais superpose le programme en cours à un nouveau, appelé Image de nouveau processus. Le nouveau fichier image de processus peut être l'un des trois types de fichier suivants:
- Fichier binaire exécutable au format de fichier XCOFF.
- Fichier de texte exécutable contenant une procédure de shell (seules les sous-routines Execlp et Execvp permettent ce type de fichier image de nouveau processus).
- Fichier qui nomme un fichier binaire exécutable ou une procédure de shell à exécuter.
La sous-routine Fexecve est équivalente à la sous-routine Execve , sauf que le sous-programme fexecve prend le descripteur de fichier d'un fichier ouvert à exécuter en tant que premier paramètre, au lieu d'un nom de chemin. Toutefois, les points suivants s'appliquent:
- Si le fichier est une procédure de shell qui est supprimée après l'opération d'ouverture, la sous-routine Fexecve démarre le shell, mais le shell ne trouve pas le fichier.
- Si le fichier est une procédure shell et que le répertoire parent du fichier est supprimé après l'ouverture du fichier, la sous-routine Fexecve renvoie un code d'erreur ENOYER .
- La sous-routine Fexecve ne vérifie pas l'autorisation d'exécution du contrôle d'accès basé sur les rôles (RBAC).
L'image de nouveau processus hérite des attributs suivants de l'image du processus appelant: l'appartenance à la session, les ID de groupe supplémentaires, le masque de signal de processus et les signaux en attente.
Le dernier des types mentionnés est reconnu par un en-tête avec la syntaxe suivante:
#! Path [String]Le #! Est le fichier Nombre magique, qui identifie le type de fichier. Le nom de chemin du fichier à exécuter est indiqué par le paramètre Chemin . Le paramètre Chaîne est une chaîne de caractères facultative qui ne contient ni tabulation ni espace. Si elle est spécifiée, cette chaîne est transmise au nouveau processus en tant qu'argument devant le nom du nouveau fichier image de processus. L'en-tête doit être arrêté avec un caractère de nouvelle ligne. Lorsqu'il est appelé, le nouveau processus transmet le paramètre Path en tant qu' argumentV[0]. Si un paramètre de type chaîne est spécifié dans le nouveau fichier d'image de processus, le sous-programme exec attribue à ArgumentV[0] les valeurs des paramètres Chaîne et Chemin concaténées ensemble. Les autres arguments transmis sont identiques à ceux transmis à la sous-routine Exec .
La sous-routine Exec tente d'annuler l'encours de Demandes d'E-S asynchrones par ce processus. Si les demandes d'E-S asynchrones ne peuvent pas être annulées, l'application est bloquée jusqu'à ce que les demandes soient terminées.
La sous-routine Exec est similaire à la sous-routine Charge , sauf que le sous-programme Exec n'a pas de paramètre de chemin de bibliothèque explicite. A la place, la sous-routine exec utilise la variable d'environnement LIBPATH ou LD_LIBRARY_PATH . La variable LIBPATH , lorsqu'elle est définie, est utilisée en faveur de LD_LIBRARY_PATH; sinon, LD_LIBRARY_PATH est utilisé. Ces variables de chemin de bibliothèque sont ignorées lorsque le programme exécuté par le sous-programme Exec a plus de privilèges que le programme appelant (par exemple, un programme Suid ).
La sous-routine Exect est incluse pour la compatibilité avec les anciens programmes qui sont tracés à l'aide de la commande Ptrace . Le programme en cours d'exécution est forcé en mode à une étape matérielle.
Paramètres
| Article | Descriptif |
|---|---|
| PATH | Spécifie un pointeur vers le nom de chemin du fichier image de nouveau processus. Si Network File System (NFS) est installé sur votre système, ce chemin peut se croiser dans un autre noeud. Les données sont copiées dans la mémoire virtuelle locale avant de continuer. |
| Fichier | Spécifie un pointeur vers le nom du nouveau fichier image de processus. A moins que le paramètre Fichier ne soit un nom de chemin complet, le préfixe de chemin du fichier est obtenu en recherchant les répertoires nommés dans la variable d'environnement CHEMIN . L'environnement initial est fourni par l'interpréteur de commandes. Remarque: Le sous-programme Execlp et le sous-programme Execvp prennent les paramètres Fichier , mais les autres sous-routines Exec prennent les paramètres Chemin . (Pour plus d'informations sur l'environnement, voir la fonction Environnement diverse et la commande Sh .)
|
| Argument0 [, Argument1, ...] | Pointe vers des chaînes de caractères à terminelle null. Les chaînes constituent la liste d'arguments disponible pour le nouveau processus. Par convention, au moins le paramètre Argument0 doit être présent, et il doit pointer vers une chaîne identique au paramètre Chemin ou à son dernier composant. |
| ArgumentV | Indique un tableau de pointeurs vers des chaînes de caractères à terminon null. Ces chaînes constituent la liste d'arguments disponible pour le nouveau processus. Par convention, le paramètre ArgumentV doit comporter au moins un élément et il doit pointer vers une chaîne identique au paramètre Path ou à son dernier composant. Le dernier élément du paramètre ArgumentV est un pointeur null. |
| EnvironmentPointer | Un tableau de pointeurs vers des chaînes de caractères à terminelle null. Ces chaînes constituent l'environnement du nouveau processus. Le dernier élément du paramètre EnvironmentPointer est un pointeur null. |
| FileDescriptor | Indique le descripteur de fichier d'un fichier ouvert à exécuter. |
Lorsqu'un programme C est exécuté, il reçoit les paramètres suivants:
main (ArgumentCount, ArgumentV, EnvironmentPointer)
int ArgumentCount;
char *ArgumentV[ ], *EnvironmentPointer[
];Dans cet exemple, le paramètre ArgumentCount est le nombre d'arguments et le paramètre ArgumentV est un tableau de pointeurs de caractères vers les arguments eux-mêmes. Par convention, la valeur du paramètre ArgumentCount est au moins égale à 1, et le paramètre ArgumentV[0] pointe vers une chaîne de caractères contenant le nom du fichier image du nouveau processus.
La routine Principal d'un programme de langage C commence automatiquement par une routine de démarrage d'exécution. Cette routine définit la variable globale environ de sorte qu'elle pointe vers le tableau d'environnement transmis au programme dans EnvironmentPointer. Vous pouvez accéder à cette variable globale en incluant la déclaration suivante dans votre programme:
extern char **environ;Les sous-programmes Execl, Execv, Execlpet Execvp utilisent la variable globale Environ pour transmettre l'environnement de processus appelant au nouveau processus.
Les descripteurs de fichier ouverts dans le processus d'appel restent ouverts, à l'exception de ceux dont l'indicateur Fermeture-sur-exec est défini. Pour les descripteurs de fichier qui restent ouverts, le pointeur de fichier est inchangé. (Pour plus d'informations sur le contrôle des fichiers, voir le fichier fcntl.h .)
Les descripteurs d'état de conversion et les descripteurs de catalogue de messages de la nouvelle image de processus ne sont pas définis. Pour le nouveau processus, un équivalent du sous-programme Setlocale , spécifiant la valeur LC_ALL pour sa catégorie et la valeur "C" pour son environnement local, est exécuté au démarrage.
Si le nouveau programme requiert des bibliothèques partagées, la sous-routine Exec trouve, ouvre et charge chacun d'entre eux dans l'espace adresse de nouveau processus. Les nombres référencés pour les bibliothèques partagées en cours d'utilisation par l'émetteur de Exec sont décrémentés. Les bibliothèques partagées sont recherchées dans les répertoires répertoriés dans la variable d'environnement LIBPATH . Si l'un de ces fichiers est distant, les données sont copiées dans la mémoire virtuelle locale.
Les sous-programmes Exec réinitialisé tous les signaux capturés à l'action par défaut. Les signaux qui entraînent l'action par défaut continuent de le faire après les sous-routines Exec . Les signaux ignorés restent ignorés, le masque de signal reste le même et l'état de la pile de signaux est réinitialisé. (Pour plus d'informations sur les signaux, voir la sous-routine Sigaction .)
Si le bit de mode SetUserID du fichier image du nouveau processus est activé, le sous-programme exec définit l'ID utilisateur effectif du nouveau processus à l'ID propriétaire du fichier image du nouveau processus. De même, si le bit de mode SetGroupID du fichier image du nouveau processus est activé, l'ID de groupe effectif du nouveau processus correspond à l'ID de groupe du fichier image du nouveau processus. L'ID utilisateur réel et l'ID de groupe réel du nouveau processus restent les mêmes que ceux du processus appelant. (Pour plus d'informations sur les modes SetID , voir la sous-routine chmod .)
A la fin de l'opération Exec , l'ID utilisateur sauvegardé et l'ID groupe sauvegardé du processus sont toujours définis sur l'ID utilisateur effectif et l'ID groupe effectif, respectivement, du processus.
Lorsqu'un ou les deux bits de mode d'ID ensemble sont définis et que le fichier à exécuter est un fichier distant, l'utilisateur de fichier et les ID de groupe passent par la traduction sortante sur le serveur. Elles sont ensuite transmises au poste client où elles sont traduites en fonction de la table de conversion entrante. Ces ID traduits deviennent les ID utilisateur et groupe du nouveau processus.
Le profilage est désactivé pour le nouveau processus.
Le nouveau processus hérite des attributs suivants du processus appelant:
- Valeur de Nice (voir la sous-routine Prior_getpriorité , la sous-routine Priorité de consigne , la sous-routine Gentile )
- ID de processus
- ID du processus parent
- ID groupe de processus
- Valeurs Semadj (voir la sous-routine Semelle )
- ID groupe tty (voir la sous-routine Sortie, Sortieou _exit , sous-routine Sigaction )
- Indicateur Trace (voir la requête 0 du sous-programme Ptrace )
- Temps restant jusqu'à un signal d'alarme (voir la sous-routine incinterval , la sous-routine setitimer et la sous-routine alarm )
- Répertoire de travail
- Répertoire racine
- Masque de création de mode fichier (voir la sous-routine Umask )
- Limite de taille de fichier (voir la sous-routine Ulimit )
- Limites de ressources (voir la sous-routine Getrlimit , la sous-routine Setrlimit et la sous-routine Vlimit )
- tms_utime,tms_stime,tms_cutimeettms_ctimeZones de la structure Tms (voir la sous-routine Heures )
- ID d'utilisateur de connexion
Une fois l'opération terminée, la marque de sous-programmes Exec pour la mise à jourst_atimeDu fichier.
Exemples
- Pour exécuter une commande et lui transmettre un paramètre, entrez:
Le sous-programme Execlp recherche chacun des répertoires répertoriés dans la variable d'environnement CHEMIN pour la commande Ls , puis il superpose l'image de processus en cours à l'aide de cette commande. Le sous-programme Execlp n'est pas renvoyé, sauf si la commande Ls ne peut pas être exécutée.execlp("ls", "ls", "-al", 0);Remarque: Cet exemple n'exécute pas le processeur de commandes de shell, de sorte que les opérations interprétées par l'interpréteur de commandes, telles que l'utilisation de caractères génériques dans les noms de fichier, ne sont pas valides. - Pour exécuter l'interpréteur de commandes pour interpréter une commande, entrez:
Cette commande exécute la commande Sh avec l'indicateur -c , ce qui indique que le paramètre suivant est la commande à interpréter. Cet exemple utilise la sous-routine execl à la place de la sous-routine execlp car le nom de chemin complet /usr/bin/sh est spécifié, ce qui rend la recherche de chemin inutile.execl("/usr/bin/sh", "sh", "-c", "ls -l *.c", 0);L'exécution d'une commande shell dans un processus enfant est généralement plus utile que la simple utilisation de la sous-routine Exec , comme illustré dans cet exemple. La méthode la plus simple consiste à utiliser le sous-programme Système .
- Voici un exemple de fichier de nouveau processus qui nomme un programme à exécuter:
Si ce fichier est nomméreverse, entrez la commande suivante sur la ligne de commande:#! /usr/bin/awk -f { for (i = NF; i > 0; --i) print $i }
Cette commande exécute la commande suivante:reverse chapter1 chapter2/usr/bin/awk -f reverse chapter1 chapter2Remarque: Les sous-routines Exec utilisent uniquement la première ligne du nouveau fichier image de processus et ignorent le reste. De plus, la commande Awk interprète le texte qui suit un signe # (dièse) comme commentaire.
Valeurs renvoyées
Une fois l'opération terminée, les sous-programmes Exec ne sont pas renvoyé car l'image du processus appelant est surposée par l'image du nouveau processus. Si les sous-programmes exec retournent au processus appelant, la valeur -1 est renvoyée et la variable globale errno est définie pour identifier l'erreur.
Codes d'erreur
Si la sous-routine Exec échoue, elle renvoie un ou plusieurs des codes d'erreur suivants:
| Article | Descriptif |
|---|---|
| EACCES | Le nouveau fichier image de processus n'est pas un fichier ordinaire. |
| EACCES | Le mode du nouveau fichier image de processus refuse l'autorisation d'exécution. |
| ENOEXEC | Le sous-programme Exec n'est ni une sous-routine Execlp ni une sous-routine Execvp . Le nouveau fichier image de processus possède les droits d'accès appropriés, mais le nombre magique dans son en-tête n'est pas valide. |
| ENOEXEC | Le nouveau fichier image de processus possède un nombre magique valide dans son en-tête, mais l'en-tête est endommagé ou est incorrect pour la machine sur laquelle le fichier doit être exécuté. |
| ETXTBSY | Le nouveau fichier image de processus est un fichier de procédure pure (texte partagé) qui est actuellement ouvert pour écriture par un processus. |
| ENOMEM | Le nouveau processus requiert plus de mémoire que ne le permet le maximum imposé par le système, l'option de compilation MAXMEM . |
| E2BIG | Le nombre d'octets de la nouvelle liste d'arguments de processus est supérieur à la limite imposée par le système. Cette limite est une valeur configurable par le système qui peut être définie par des superutilisateurs ou des utilisateurs de groupes de systèmes à l'aide de SMIT. Pour plus d'informations, voir Paramètres du noyau Tunable . |
| EDÉFAUT | Le paramètre Path, ArgumentV ou EnvironmentPointer pointe en dehors de l'espace d'adressage du processus. |
| EPERM | Le bit de mode SetUserID ou SetGroupID est activé dans le fichier image de traitement. Les tables de traduction sur le serveur ou le client ne permettent pas la traduction de cet ID utilisateur ou groupe. |
Si la sous-routine Exec échoue en raison d'une condition nécessitant une résolution de nom de chemin, elle renvoie un ou plusieurs des codes d'erreur suivants:
| Article | Descriptif |
|---|---|
| EACCES | Le droit de recherche est refusé sur un composant du préfixe de chemin. L'accès peut être refusé en raison d'un montage sécurisé. |
| EDÉFAUT | Le paramètre Chemin pointe en dehors de l'espace adresse alloué du processus. |
| EIO | Une erreur d'entrée-sortie (E-S) s'est produite pendant l'opération. |
| ELOOP | Un trop grand nombre de liens symboliques a été détecté lors de la traduction du paramètre Chemin . |
| ENAMETOOLONG | Un composant d'un nom de chemin a dépassé 255 caractères et le processus a l'attribut Interruption de la troncature (voir la sous-routine Ulimit ), ou un nom de chemin entier a dépassé les 1023 caractères. |
| ENOENT | Un composant du préfixe de chemin n'existe pas. |
| ENOENT | Un lien symbolique a été nommé, mais le fichier auquel il fait référence n'existe pas. |
| ENOENT | Le nom de chemin est null. |
| ENOTDIR | Un composant du préfixe de chemin n'est pas un répertoire. |
| ESTALE | Le répertoire racine ou en cours du processus se trouve dans un système de fichiers virtuel qui a été démonté. |
En outre, certaines erreurs peuvent se produire lors de l'utilisation du nouveau fichier de processus une fois que l'ancienne image de processus a été remplacée. Ces erreurs incluent des problèmes lors de la configuration des nouveaux registres de données et de pile, des problèmes de mappage d'une bibliothèque partagée ou des problèmes de lecture du nouveau fichier de processus. Etant donné que le retour au processus d'appel n'est pas possible, le système envoie le signal SIGKILL au processus lorsque l'une de ces erreurs se produit.
Si une erreur s'est produite lors du mappage d'une bibliothèque partagée, un message d'erreur décrivant la cause de l'erreur est écrit en erreur standard avant que le signal SIGKILL ne soit envoyé au processus. Si une bibliothèque partagée ne peut pas être mappée, la sous-routine renvoie l'un des codes d'erreur suivants:
| Article | Descriptif |
|---|---|
| ENOENT | Un ou plusieurs composants du nom de chemin du fichier de bibliothèque partagée n'existent pas. |
| ENOTDIR | Un composant du préfixe de chemin du fichier de bibliothèque partagée n'est pas un répertoire. |
| ENAMETOOLONG | Un composant d'un préfixe de nom de chemin d'un fichier de bibliothèque partagée a dépassé 255 caractères, ou un nom de chemin entier a dépassé les 1023 caractères. |
| EACCES | Le droit de recherche est refusé pour un répertoire répertorié dans le préfixe de chemin du fichier de bibliothèque partagée. |
| EACCES | Le mode de fichier de bibliothèque partagée refuse l'autorisation d'exécution. |
| ENOEXEC | Le fichier de bibliothèque partagée dispose des droits d'accès appropriés, mais un nombre magique dans son en-tête n'est pas valide. |
| ETXTBSY | Le fichier de bibliothèque partagée est actuellement ouvert pour écriture par un autre processus. |
| ENOMEM | La bibliothèque partagée requiert plus de mémoire que celle autorisée par le maximum imposé par le système. |
| ESTALE | La racine de processus ou le répertoire en cours se trouve dans un système de fichiers virtuel qui a été démonté. |
| EPROCLIM | Si WLM est en cours d'exécution, la limite du nombre de processus, d'unités d'exécution ou de connexions dans la classe peut avoir été atteinte. |
Si la sous-routine Fexecve échoue, elle peut également renvoyer l'un des codes d'erreur suivants:
| Article | Descriptif |
|---|---|
| EBADF | L'argument FileDescriptor ne spécifie pas de descripteur de fichier ouvert valide. |
| ENOENT | L'argument FileDescriptor pointe vers une procédure shell, mais le répertoire parent d'origine du fichier a été supprimé. |
Si NFS est installé sur le système, la sous-routine exec peut également échouer si les conditions suivantes sont remplies:
| Article | Descriptif |
|---|---|
| ETIMEDOUT | La connexion a expiré. |