_exec
, _wexec
Fonctions
Chaque fonction dans cette famille charge et exécute un nouveau processus :
La lettre à la fin du nom de fonction détermine la variance.
_exec suffixe de fonction |
Description |
---|---|
e |
envp , un tableau de pointeurs vers les paramètres d'environnement, est passé au nouveau processus. |
l |
Les arguments de ligne de commande sont passés individuellement à la fonction _exec . Utilisée généralement quand le nombre de paramètres du nouveau processus est connu à l'avance. |
p |
La variable d'environnement PATH est utilisée pour rechercher le fichier à exécuter. |
v |
argv , un tableau de pointeurs vers des arguments de ligne de commande, est passé à _exec . Utilisée généralement quand le nombre de paramètres du nouveau processus est variable. |
Notes
Chaque fonction _exec
charge et exécute un nouveau processus. Toutes les _exec
fonctions utilisent la même fonction de système d’exploitation (CreateProcess
). Les fonctions _exec
gèrent automatiquement des arguments de chaîne de caractères multioctets de façon appropriée, en identifiant des séquences de caractères multioctets selon la page de codes multioctets actuellement utilisée. Les fonctions _wexec
sont des versions à caractères larges des fonctions _exec
. Les _wexec
fonctions se comportent de la même façon que leurs _exec
équivalents familiaux, sauf qu’elles ne gèrent pas les chaînes de caractères multioctets.
Mappages de routines de texte générique
Routine Tchar.h |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_texecl |
_execl |
_execl |
_wexecl |
_texecle |
_execle |
_execle |
_wexecle |
_texeclp |
_execlp |
_execlp |
_wexeclp |
_texeclpe |
_execlpe |
_execlpe |
_wexeclpe |
_texecv |
_execv |
_execv |
_wexecv |
_texecve |
_execve |
_execve |
_wexecve |
_texecvp |
_execvp |
_execvp |
_wexecvp |
_texecvpe |
_execvpe |
_execvpe |
_wexecvpe |
Le paramètre cmdname
spécifie le fichier à exécuter comme nouveau processus. Il peut spécifier un chemin d'accès complet (depuis la racine), un chemin d'accès partiel (depuis le répertoire de travail actif) ou un nom de fichier. Si cmdname
elle n’a pas d’extension de nom de fichier ou ne se termine pas par un point (.), la _exec
fonction recherche le fichier nommé. Si la recherche n'aboutit pas, elle tente le même nom de base avec l'extension de nom de fichier .com, puis avec les extensions de nom de fichier .exe, .bat et .cmd. Si cmdname
a une extension de nom de fichier, seule cette extension est employée dans la recherche. Si cmdname
se termine par un point, la fonction _exec
recherche cmdname
sans extension de nom de fichier. _execlp
, _execlpe
, _execvp
et _execvpe
recherchent cmdname
(en utilisant les mêmes procédures) dans les répertoires spécifiés par la variable d'environnement PATH
. Si cmdname
contient un spécificateur de lecteur ou des barres obliques (autrement dit, s’il s’agit d’un chemin relatif), l’appel _exec
recherche uniquement le fichier spécifié ; le chemin d’accès n’est pas recherché.
Les paramètres sont passés au nouveau processus en fournissant un ou plusieurs pointeurs vers des chaînes de caractères comme paramètres dans l'appel de fonction _exec
. Ces chaînes de caractères forment la liste de paramètres du nouveau processus. La longueur combinée des paramètres d'environnement hérités et des chaînes qui forment la liste de paramètres du nouveau processus ne doit pas dépasser 32 kilo-octets. Le caractère de fin NULL
(\0
) de chaque chaîne n’est pas inclus dans le nombre, mais les caractères d’espace (insérés automatiquement pour séparer les paramètres) sont comptabilisés.
Remarque
Les espaces incorporés dans les chaînes peuvent provoquer un comportement inattendu ; par exemple, le passage à _exec
de la chaîne "hi there"
a comme conséquence que le nouveau processus obtient deux arguments, "hi"
et "there"
. Si l'objectif était que le nouveau processus ouvre un fichier nommé « hi there », le processus échoue. Vous pouvez éviter cela en plaçant la chaîne "\"hi there\""
entre guillemets.
Important
Ne passez pas d'entrée utilisateur à _exec
sans vérifier explicitement son contenu. _exec
entraîne un appel pour que vous gardant à CreateProcess
l’esprit que les noms de chemins non qualifiés pourraient entraîner des vulnérabilités de sécurité potentielles.
Les fonctions _exec
valident leurs paramètres. Si les paramètres attendus sont des pointeurs Null, des chaînes vides ou omis, les _exec
fonctions appellent le gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres. Si l'exécution est autorisée à se poursuivre, ces fonctions définissent errno
avec la valeur EINVAL
et retournent -1. Aucun nouveau processus n'est exécuté.
Les pointeurs d'argument peuvent être passés comme paramètres distincts (dans _execl
, _execle
, _execlp
et _execlpe
) ou comme tableau de pointeurs (dans _execv
, _execve
, _execvp
et _execvpe
). Au moins un paramètre, arg0
doit être passé au nouveau processus ; ce paramètre est argv[0]
du nouveau processus. Généralement, ce paramètre est une copie de cmdname
. (Une autre valeur ne produit pas d’erreur.)
Les appels de fonctions _execl
, _execle
, _execlp
et _execlpe
sont généralement utilisés quand le nombre de paramètres est connu à l'avance. Le paramètre arg0
est généralement un pointeur vers cmdname
. Les paramètres arg1
à argn
pointent vers les chaînes de caractères qui forment la nouvelle liste de paramètres. Un pointeur Null doit suivre argn
pour marquer la fin de la liste de paramètres.
Les appels de fonctions _execv
, _execve
, _execvp
et _execvpe
sont utiles quand le nombre de paramètres du nouveau processus est variable. Les pointeurs vers les paramètres sont passés comme tableau, argv
. Le paramètre argv[0]
est généralement un pointeur vers cmdname
. Les paramètres argv[1]
à argv[n]
pointent vers les chaînes de caractères qui forment la nouvelle liste de paramètres. Le paramètre argv[n+1]
doit être un NULL
pointeur pour marquer la fin de la liste des paramètres.
Les fichiers qui sont ouverts quand un appel de fonction _exec
est effectué restent ouverts dans le nouveau processus. Dans les appels de fonctions _execl
, _execlp
, _execv
et _execvp
, le nouveau processus hérite de l'environnement du processus appelant. Les appels de fonctions _execle
, _execlpe
, _execve
et _execvpe
modifient l'environnement du nouveau processus en passant une liste de paramètres d'environnement via le paramètre envp
. envp
est un tableau de pointeurs de caractères, dont chaque élément (excepté le dernier) pointe vers une chaîne terminée par le caractère Null définissant une variable d'environnement. Une telle chaîne a généralement la forme NAME=value
où NAME
est le nom d’une variable d’environnement et value
est la valeur de chaîne selon laquelle cette variable est définie. (Les value
guillemets doubles ne sont pas placés entre guillemets.) L’élément final du envp
tableau doit être NULL
. Quand envp
lui-même a la valeur NULL
, le nouveau processus hérite des paramètres d'environnement du processus appelant.
Un programme exécuté avec l’une des _exec
fonctions est toujours chargé en mémoire, comme si le champ d’allocation maximal dans l’en-tête de fichier .exe du programme a été défini sur la valeur par défaut de 0xFFFFH
.
Les _exec
appels ne conservent pas les modes de traduction des fichiers ouverts. Si le nouveau processus doit utiliser des fichiers hérités du processus appelant, utilisez la _setmode
routine pour définir le mode de traduction de ces fichiers en mode souhaité. Vous devez explicitement vider (à l'aide de fflush
ou de _flushall
) ou fermer tout flux avant l'appel de fonction _exec
. Les paramètres de signal ne sont pas conservés dans les nouveaux processus créés par des appels à _exec
des routines. Les paramètres de signal sont réinitialisés à la valeur par défaut dans le nouveau processus.
Exemple
// crt_args.c
// Illustrates the following variables used for accessing
// command-line arguments and environment variables:
// argc argv envp
// This program will be executed by crt_exec which follows.
#include <stdio.h>
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char **envp ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
printf( "\nCommand-line arguments:\n" );
for( count = 0; count < argc; count++ )
printf( " argv[%d] %s\n", count, argv[count] );
// Display each environment variable.
printf( "\nEnvironment variables:\n" );
while( *envp != NULL )
printf( " %s\n", *(envp++) );
return;
}
Lancez le programme suivant pour exécuter Crt_args.exe :
// crt_exec.c
// Illustrates the different versions of exec, including
// _execl _execle _execlp _execlpe
// _execv _execve _execvp _execvpe
//
// Although CRT_EXEC.C can exec any program, you can verify how
// different versions handle arguments and environment by
// compiling and specifying the sample program CRT_ARGS.C. See
// "_spawn, _wspawn Functions" for examples of the similar spawn
// functions.
#include <stdio.h>
#include <conio.h>
#include <process.h>
char *my_env[] = // Environment for exec?e
{
"THIS=environment will be",
"PASSED=to new process by",
"the EXEC=functions",
NULL
};
int main( int ac, char* av[] )
{
char *args[4];
int ch;
if( ac != 3 ){
fprintf( stderr, "Usage: %s <program> <number (1-8)>\n", av[0] );
return;
}
// Arguments for _execv?
args[0] = av[1];
args[1] = "exec??";
args[2] = "two";
args[3] = NULL;
switch( atoi( av[2] ) )
{
case 1:
_execl( av[1], av[1], "_execl", "two", NULL );
break;
case 2:
_execle( av[1], av[1], "_execle", "two", NULL, my_env );
break;
case 3:
_execlp( av[1], av[1], "_execlp", "two", NULL );
break;
case 4:
_execlpe( av[1], av[1], "_execlpe", "two", NULL, my_env );
break;
case 5:
_execv( av[1], args );
break;
case 6:
_execve( av[1], args, my_env );
break;
case 7:
_execvp( av[1], args );
break;
case 8:
_execvpe( av[1], args, my_env );
break;
default:
break;
}
// This point is reached only if exec fails.
printf( "\nProcess was not execed." );
exit( 0 );
}
Spécifications
En-tête : process.h
Voir aussi
Processus et contrôle d’environnement
abort
atexit
exit
, , _Exit
_exit
_onexit
, _onexit_m
_spawn
, fonctions _wspawn
system
, _wsystem