_exec, _wexec功能
字母在函数名结束时确定变体。
_exec 功能后缀 |
说明 |
---|---|
e |
envp,某些属性环境设置的指针,传递给新过程。 |
l |
命令行参数分别传递给 _exec 功能。 通常使用参数的数量来在更新过程事先知道。 |
p |
PATH 环境变量用于查找文件执行。 |
v |
argv,某些属性命令行参数的指针,传递给 _exec。 通常使用参数的数量来在更新过程是可变的。 |
备注
每个 _exec 功能加载并执行更新过程。 所有 _exec 功能使用相同的操作系统的功能 (CreateProcess)。 _exec 自动函数处理多字节字符串参数根据需要,识别多字节字符顺序基于当前正在使用多字节代码的页。 _wexec 功能是 _exec 功能的宽字符版本。 _wexec 函数方法的行为与它们的 _exec 系列副本,但它们不处理多字节字符字符串。
一般文本例程映射
Tchar.h 实例 |
未定义的 _UNICODE 和 _MBCS |
定义的 _MBCS |
定义的 _UNICODE |
---|---|---|---|
_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 |
cmdname 参数指定为要执行的文件更新过程。 它可以指定完整路径 (从根),一部分路径 (从当前工作目录中),或文件名。 如果 cmdname 不具有文件扩展名还提供期间不结束 (), _exec 功能搜索命名的文件。 如果搜索不成功,它尝试相同基名称的文件扩展名为 .com 然后与 .exe、 .bat 和 .cmd 文件扩展名。 如果 cmdname 具有文件扩展名,因此,只有该扩展用于搜索。 如果 cmdname 以句点结束, _exec 功能搜索 cmdname 不带文件扩展名。 _execlp、 _execlpe、 _execvp和 _execvpe 搜索 cmdname (使用相同的程序)。 PATH 环境变量指定的目录。 如果 cmdname 包含一个驱动器说明符或任何杠 (即,如果它是相对路径), _exec 调用只搜索中指定的文件;路径不会搜索。
参数传递给通过为一个或多个指针更新过程字符串中,在 _exec 的参数调用。 为参数列表更新过程中的这些字符字符串窗体。 继承的环境设置的组合长度和窗体的字符串为参数列表更新过程不能超过 32 KB。 终止 null 字符 (“\ 0 ") 每个字符串的不包含在计数中,但是,空格 (自动插入分隔参数) 计数。
备注
字符串中嵌入的空间可能导致意外行为;例如,通过 _exec 该字符串 "hi there" 导致更新过程获取两个参数、 "hi" 和 "there"。如果此语句的目的是具有更新过程打开名为的文件 “hi there”,过程将失败。通过引用该字符串避免此: "\"hi there\""。
安全说明 |
---|
不要将用户输入到 _exec 不显式检查其内容。_exec 导致调用 CreateProcess ,因此请记住非限定路径名可能导致潜在的安全漏洞。 |
_exec 功能验证方法的参数。 如果所需的参数为 null 指针,空字符串或省略, _exec 函数调用的参数无效处理程序 参数验证如中所述。 如果执行允许继续,对 EINVAL 的这些功能集 errno 并且返回 -1。 不更新过程中执行。
参数指针可作为单独的参数 (在 _execl、 _execle、 _execlp和 _execlpe) 或数组形式的指针 (在 _execv、 _execve、 _execvp和 _execvpe)。 至少必须通过一个参数, arg0,以更新过程;此参数是 argv[0] 更新过程。 通常,此参数是 cmdname的副本。 (其他值不会导致错误。)
,当参数的数目事先,了解 _execl、 _execle、 _execlp和 _execlpe 调用通常使用。 该参数 arg0 通常是指向 cmdname。 arg1 通过 argn 指向窗体新的字符串) 的参数。 null 指针必须遵循 argn 指示结束参数列表。
,当参数的数量来更新过程是可变时, _execv、 _execve、 _execvp和 _execvpe 调用很有用。 对参数的指针将作为数组, argv。 该参数 argv[0] 通常是指向 cmdname。 argv的参数 [1] 通过 argv[]n指向窗体新的字符串) 参数列表。 该参数 argv[n+1] 必须是标记末尾的 NULL 指针参数列表。
已打开的文件,并且 _exec 调用时在使保持打开状态更新过程。 在 _execl, _execlp, _execv,并且, _execvp 调用,更新过程继承调用环境的过程。 _execle、 _execlpe、 _execve和 _execvpe 调用修改环境通过环境设置列表更新过程 envp 参数。 envp 是一个字符数组的指针,每个元素 (除最后的元素) 指向定义的环境变量以 NULL 结尾的字符串。 这种字符串通常具有 NAME 是环境变量的名称的窗体 NAME=value ,并 value 是该变量设置的字符串值。 (请注意 value 在双引号没有包含。)envp 数组的最终元素应为 NULL。 当 envp 是 NULL时,更新过程继承调用的环境设置。
程序执行过程中使用一个 _exec 函数始终加载到内存,就象在程序的 .exe 文件头的最大分派字段设置为 0xFFFFH 的默认值。
_exec 调用不保留打开文件转换模式。 如果更新过程必须使用从调用继承文件的过程,使用 _setmode 实例设置特定模式这些文件添加到所需的模式。 必须显式刷新 (使用 fflush 或 _flushall) 或关闭所有流,在 _exec 函数调用之前。 信号将创建对 _exec 实例的不保留更新过程。 信号设置被重置为中的默认更新过程。
示例
// 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;
}
运行下面的过程中执行 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 );
}
.NET framework 等效
标题: process.h