_spawn, _wspawn功能
字母在函数名结束时确定变体。
e
envp,某些属性环境设置的指针,传递给新过程。l
命令行参数分别传递给 _spawn 功能。 此后缀,当对的参数更新过程事先知道,通常使用。p
PATH 环境变量用于查找文件执行。v
argv,某些属性命令行参数的指针,传递给 _spawn 功能。 此后缀,当对的参数更新过程是可变时,通常使用。
备注
_spawn 函数每个创建并执行更新过程。 自动其所处理的多字节字符串参数根据需要,识别多字节字符顺序基于当前正在使用多字节代码的页。 _wspawn 功能是 _spawn 功能的宽字符版本;它们不处理多字节字符字符串。 否则, _wspawn 函数方法的行为与它们的 _spawn 副本。
一般文本例程映射
Tchar.h 实例 |
未定义的 _UNICODE 和 _MBCS |
定义的 _MBCS |
定义的 _UNICODE |
---|---|---|---|
_tspawnl |
_spawnl |
_spawnl |
_wspawnl |
_tspawnle |
_spawnle |
_spawnle |
_wspawnle |
_tspawnlp |
_spawnlp |
_spawnlp |
_wspawnlp |
_tspawnlpe |
_spawnlpe |
_spawnlpe |
_wspawnlpe |
_tspawnv |
_spawnv |
_spawnv |
_wspawnv |
_tspawnve |
_spawnve |
_spawnve |
_wspawnve |
_tspawnvp |
_spawnvp |
_spawnvp |
_wspawnvp |
_tspawnvpe |
_spawnvpe |
_spawnvpe |
_wspawnvpe |
足够的内存必须适用于加载,并执行更新过程。 在 _spawn的过程中升级, mode 参数确定调用执行的操作处理。 mode 的下列值在 Process.h 定义:
_P_OVERLAY
复盖调用进程已更新的过程,销毁调用进程 (与 _exec 调用) 的效果。_P_WAIT
挂起调用线程,直至执行的更新过程完成 (同步 _spawn)。_P_NOWAIT 或 _P_NOWAITO
继续执行调用的同时处理更新过程 (异步 _spawn)。_P_DETACH
继续执行调用处理;在后台更新过程运行不到控制台或键盘访问。 调用 _cwait 更新过程失败 (异步 _spawn)。
cmdname 参数指定执行为更新过程并可以指定完整路径的文件 (从根),一部分路径 (从当前工作目录中),或文件名。 如果 cmdname 不具有文件扩展名还提供期间不结束 (), _spawn 函数首先尝试 .com 文件扩展名然后 .exe 文件扩展名、 .bat 文件扩展名和最后 .cmd 文件扩展名。
如果 cmdname 具有文件扩展名,因此,只有使用该扩展。 如果 cmdname 以句点结束, _spawn 调用搜索 cmdname 不带文件扩展名。 _spawnlp、 _spawnlpe、 _spawnvp和_spawnvpe 功能搜索 cmdname (使用相同的程序)。 PATH 环境变量指定的目录。
如果 cmdname 包含一个驱动器说明符或任何杠 (即,如果它是相对路径), _spawn 调用只搜索中指定的文件;路径搜索未完成。
过去,这些功能集 errno 在成功为零;当前行为是将 errno 未触动后在成功,如指定根据 C 标准。 如果需要模拟旧行为,请设置 errno 在调用这些函数之前为零。
备注
要确保正确云初始化,然后停止,不使用 setjmp 或 longjmp 函数的进入或离开复盖率实例。
给出的参数处理
若要将参数传递给更新过程,它将产生一个或多个指针字符串中,在 _spawn 调用参数。 给定的参数列表处理的这些字符字符串窗体。 窗体的字符串的合并的长度为参数列表更新过程不能超过 1024 个字节。 终止 null 字符 (“\ 0 ") 每个字符串的不包含在计数中,但是,空格 (自动插入到单独参数) 包括在内。
备注
字符串中嵌入的空间可能导致意外行为;例如,通过 _spawn 该字符串 "hi there" 导致更新过程获取两个参数、 "hi" 和 "there"。如果此语句的目的是具有更新过程打开名为的文件 “hi there”,过程将失败。通过引用该字符串避免此: "\"hi there\""。
安全说明 |
---|
不要将用户输入到 _spawn 不显式检查其内容。_spawn 导致调用 CreateProcess ,因此请记住非限定路径名可能导致潜在的安全漏洞。 |
可以将实参通过指针作为单独参数 (在 _spawnl、 _spawnle、 _spawnlp和 _spawnlpe) 或数组形式的指针 (在 _spawnv、 _spawnve、 _spawnvp和 _spawnvpe)。 必须将至少一个参数, arg0 或 argv[0],对给定进程。 按照约定,代码,就象键入在命令行上对其进行,此参数是程序的名称。 一个值不会导致错误。
,在参数的数目事先情况下,了解 _spawnl、 _spawnle、 _spawnlp和 _spawnlpe 调用通常使用。 arg0 参数通常是指向 cmdname。 arg1 通过 argn 是指向窗体新的字符串) 的参数参数列表。 在 argn之后,必须具有标记末尾的 NULL 指针参数列表。
,当有参数数目可变更新过程时, _spawnv、 _spawnve、 _spawnvp和 _spawnvpe 调用很有用。 给参数的指针将作为数组, argv*。*参数 argv[0] 通常是指向一个路径在实地址模式或给过程名在保护模式和 argv[1] 通过 argv[]n是指向窗体新的字符串) 参数列表。 参数 argv[n +1] 必须是标记末尾的 NULL 指针参数列表。
给定环境的过程
已打开的文件,并且 _spawn 调用时在使保持打开状态更新过程。 在 _spawnl, _spawnlp, _spawnv,并且, _spawnvp 调用,更新过程继承调用环境的过程。 可以使用 _spawnle, _spawnlpe, _spawnve,并且, _spawnvpe 调用修改环境通过环境设置列表更新过程 envp 参数。 参数 envp 是一个字符数组的指针, (除最后的元素) 指向定义的环境变量以 NULL 结尾的字符串的每个元素。 这种字符串通常具有 NAME 是环境变量的名称的窗体 NAME=value ,并 value 是该变量设置的字符串值。 (请注意 value 在双引号没有包含。)envp 数组的最终元素应为 NULL。 当 envp 是 NULL时,将处理继承的环境设置父进程。
_spawn 功能可以对将有关打开文件的所有信息,包括版本模式,更新过程。 此信息在实地址模式通过 C_FILE_INFO 项在环境。 启动代码通常处理此项从该环境然后删除它。 但是,因此,如果 _spawn 函数使非 C 进程,此项保持在环境。 ,因为环境信息在实址方式下,通过二进制格式的打印该环境此项的定义字符串显示映射字符。 它不应对行为的其他效果。 在保护模式下,环境信息以文本形式而不包含映射字符。
必须显式刷新 (使用 fflush 或 _flushall) 或关闭所有流在调用 _spawn 功能之前。
更新过程创建对 _spawn 实例不保留信号设置。 相反,将处理重置信号设置为默认值。
将输出重定向
如果从 DLL 或 GUI 应用程序的 _spawn 并希望将输出重定向到管道,您有两个选项:
使用 Win32 API 创建管道,然后调用 AllocConsole,将在启动结构的情况下处理值,并调用 CreateProcess。
调用将创建一个管道的 _popen, _wpopen 并调用该应用程序使用 cmd.exe /c (或 command.exe /c)。
示例
// crt_spawn.c
// This program accepts a number in the range
// 1-8 from the command line. Based on the number it receives,
// it executes one of the eight different procedures that
// spawn the process named child. For some of these procedures,
// the CHILD.EXE file must be in the same directory; for
// others, it only has to be in the same path.
//
#include <stdio.h>
#include <process.h>
char *my_env[] =
{
"THIS=environment will be",
"PASSED=to child.exe by the",
"_SPAWNLE=and",
"_SPAWNLPE=and",
"_SPAWNVE=and",
"_SPAWNVPE=functions",
NULL
};
int main( int argc, char *argv[] )
{
char *args[4];
// Set up parameters to be sent:
args[0] = "child";
args[1] = "spawn??";
args[2] = "two";
args[3] = NULL;
if (argc <= 2)
{
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
switch (argv[1][0]) // Based on first letter of argument
{
case '1':
_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
break;
case '2':
_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",
NULL, my_env );
break;
case '3':
_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
break;
case '4':
_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",
NULL, my_env );
break;
case '5':
_spawnv( _P_OVERLAY, argv[2], args );
break;
case '6':
_spawnve( _P_OVERLAY, argv[2], args, my_env );
break;
case '7':
_spawnvp( _P_OVERLAY, argv[2], args );
break;
case '8':
_spawnvpe( _P_OVERLAY, argv[2], args, my_env );
break;
default:
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
printf( "from SPAWN!\n" );
}