_spawn, _wspawn功能

_spawnl, _wspawnl

_spawnv, _wspawnv

_spawnle, _wspawnle

_spawnve, _wspawnve

_spawnlp, _wspawnlp

_spawnvp, _wspawnvp

_spawnlpe, _wspawnlpe

_spawnvpe, _wspawnvpe

字母在函数名结束时确定变体。

  • 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" );
}
  

请参见

参考

处理和环境控件

abort

atexit

_exec, _wexec功能

exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem