_exec, funciones de _wexec
Cada función de esta familia carga y ejecuta un nuevo proceso:
La letra al final del nombre de función determina la variación.
sufijo de la función de _exec |
Descripción |
---|---|
e |
envp, matriz de punteros a la configuración de entorno, se pasa al nuevo proceso. |
l |
los argumentos de la línea de comandos se pasan individualmente a la función de _exec .Normalmente se utiliza cuando el número de parámetros al nuevo proceso se conoce de antemano. |
p |
la variable de entornoPATH se utiliza para buscar el archivo para ejecutarse. |
v |
argv, matriz de punteros a los argumentos de la línea de comandos, se pasa a _exec.Normalmente se utiliza cuando el número de parámetros al nuevo proceso es variable. |
Comentarios
cada función de _exec carga y ejecuta un nuevo proceso.Todas las funciones de _exec utilizan la misma función del sistema operativo (CreateProcess).Las funciones de _exec controlan automáticamente argumentos de cadena de caracteres multibyte según corresponda, reconociendo secuencias de caracteres multibyte según la página de códigos multibyte actualmente en uso.Las funciones de _wexec son versiones de caracteres anchos de las funciones de _exec .Las funciones de _wexec se comportan de forma idéntica a sus homólogos de la familia de _exec salvo que no controlan las cadenas de caracteres multibyte.
Asignaciones de la rutina de texto genérico
rutina de Tchar.h |
_UNICODE y _MBCS no definido |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_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 |
el parámetro de cmdname especifica el archivo que se ejecutará como el nuevo proceso.Puede especificar una ruta de acceso completa (raíz), una ruta parcial (del directorio de trabajo actual), o un nombre de archivo.Si cmdname no tiene una extensión de nombre de archivo ni la finaliza con un punto (.), las búsquedas de la función de _exec para el archivo con nombre.Si la búsqueda no es correcta, intenta el mismo nombre base con la extensión de nombre de archivo .com y después con extensiones de nombre de archivo .exe, .bat, y .cmd.Si cmdname tiene una extensión de nombre de archivo, sólo esa extensión se usa en la búsqueda.Si finaliza con un punto, las búsquedas de cmdname de la función de _exec para cmdname sin la extensión de nombre de archivo._execlp, _execlpe, _execvp, y búsqueda de _execvpe para cmdname (utilizando los mismos procedimientos) en los directorios especificados por la variable de entorno PATH .Si cmdname contiene un especificador de unidad o las barras diagonales (es decir, si es una ruta de acceso relativa), la llamada de _exec busca únicamente el archivo especificado; la ruta no se busca.
Los parámetros se pasan al nuevo proceso da uno o varios punteros a cadenas de caracteres como los parámetros en la llamada de _exec .Estas cadenas de caracteres forman la lista de parámetros para el nuevo proceso.La longitud combinada de la configuración de entorno heredadas y de las cadenas que forman la lista de parámetros para el nuevo proceso no debe superar 32 kilobytes.El carácter null de terminación (“\ 0 ") para cada cadena no se incluye en el recuento, pero los caracteres de espacio (inserta automáticamente para separar los parámetros) se cuentan.
[!NOTA]
Los espacios insertados en cadenas pueden causar un comportamiento inesperado; por ejemplo, pasar _exec la cadena "hi there" provocará el nuevo proceso que obtiene dos argumentos, "hi" y "there".Si el intento sin tener el nuevo proceso abre un archivo denominado “hello there”, el proceso produciría un error.Puede evitarlo citando string: "\"hi there\"".
Nota sobre la seguridad |
---|
No pase los datos proporcionados por el usuario a _exec sin comprobar explícitamente su contenido._exec dará lugar a una llamada a CreateProcess para que tenga presente que los nombres de ruta de acceso calificada podrían provocar vulnerabilidades de seguridad potenciales. |
las funciones de _exec validan sus parámetros.Si los parámetros esperados son punteros nulos, cadenas vacías, u omitido, las funciones de _exec se invoca el controlador no válido del parámetro tal como se describe en Validación de parámetros.Si la ejecución puede continuar, este errno establecido funciones a EINVAL y retorno -1.no se ejecuta ningún nuevo proceso.
Punteros de argumento se pueden pasar como parámetros separados (en _execl, _execle, _execlp, y _execlpe) o como una matriz de punteros (en _execv, _execve, _execvp, y _execvpe).Al menos un parámetro, arg0, se debe pasar al nuevo proceso; este parámetro es argv[0] del nuevo proceso.Normalmente, este parámetro es una copia de cmdname.(Valor diferente de A no genera un error).
_execl, _execle, _execlp, y las llamadas de _execlpe se utilizan normalmente cuando el número de parámetros se conoce de antemano.El parámetro arg0 suele ser un puntero a cmdname.Los parámetros arg1 a través del punto de argn a cadenas de caracteres que forman la nueva lista de parámetros.Un puntero NULL debe seguir argn para marcar el final de la lista de parámetros.
_execv, _execve, _execvp, y las llamadas de _execvpe son útiles cuando el número de parámetros al nuevo proceso es variable.Los punteros a los parámetros se pasan como matriz, argv.El parámetro argv[0] es normalmente puntero a cmdname.Los parámetros argv[1] a través del punto de argv[n] a cadenas de caracteres que forman la nueva lista de parámetros.El parámetro argv[n+1] debe ser un puntero de NULL para marcar el final de la lista de parámetros.
Los archivos que están abiertos cuando se realiza una llamada de _exec permanecen abiertos en el nuevo proceso.En _execl, _execlp, _execv, y las llamadas de _execvp , el nuevo proceso hereda el entorno del proceso de llamada._execle, _execlpe, _execve, y las llamadas de _execvpe modifican el entorno para el nuevo proceso pasando una lista de configuración de entorno con el parámetro de envp .envp es una matriz de punteros de carácter, cada elemento cuyo (salvo el elemento final) señala una cadena terminada en null define una variable de entorno.Esta cadena es normalmente el formulario NAME=value donde es el nombre NAME de una variable de entorno y value es el valor de cadena al que se establece la variable.(Observe que value no están encerrados entre comillas). El último elemento de la matriz de envp debe ser NULL.Cuando envp propio es NULL, el nuevo proceso hereda la configuración del entorno del proceso de llamada.
Un programa ejecutado con una de las funciones de _exec se carga siempre en memoria como si el campo de asignación máxima en el encabezado del archivo .exe de programa fuera establecido en el valor predeterminado de 0xFFFFH.
Las llamadas de _exec no conservan los modos de traducción de archivos abiertos.Si el nuevo proceso debe utilizar los archivos heredados del proceso de llamada, utilice la rutina de _setmode para establecer el de modalidad de traducción de estos archivos el modo deseado.Debe explícitamente vaciar (mediante fflush o _flushall) o cerrar cualquier secuencia antes de la llamada de función _exec .Los valores de la señal no se conservan en los nuevos procesos creados mediante llamadas a las rutinas de _exec .Los valores de la señal se restauran a predeterminado en el nuevo proceso.
Ejemplo
// 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;
}
Ejecute el programa siguiente para ejecutar 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 );
}
equivalente de .NET Framework
encabezado: process.h