_spawn, _wspawn 함수_spawn, _wspawn Functions

_spawn 함수는 새로운 프로세스를 만들고 실행합니다.Each of the _spawn functions creates and executes a new process:

_spawnl, _wspawnl_spawnl, _wspawnl _spawnv, _wspawnv_spawnv, _wspawnv
_spawnle, _wspawnle_spawnle, _wspawnle _spawnve, _wspawnve_spawnve, _wspawnve
_spawnlp, _wspawnlp_spawnlp, _wspawnlp _spawnvp, _wspawnvp_spawnvp, _wspawnvp
_spawnlpe, _wspawnlpe_spawnlpe, _wspawnlpe _spawnvpe, _wspawnvpe_spawnvpe, _wspawnvpe

함수 이름 끝에 있는 문자에 따라 변형이 결정됩니다.The letters at the end of the function name determine the variation.

e
환경 설정에 대한 포인터 배열인 envp가 새로운 프로세스에 전달됩니다.envp, array of pointers to environment settings, is passed to new process.

l
명령줄 인수는 _spawn 함수로 개별적으로 전달됩니다.Command-line arguments are passed individually to _spawn function. 이 접미사는 일반적으로 새로운 프로세스에 대한 여러 매개 변수를 미리 알고 있을 때 사용됩니다.This suffix is typically used when a number of parameters to a new process is known in advance.

p
PATH 환경 변수는 실행할 파일을 찾는 데 사용됩니다.PATH environment variable is used to find the file to execute.

v
명령줄 인수에 대한 포인터 배열인 argv_spawn 함수에 전달됩니다.argv, array of pointers to command-line arguments, is passed to _spawn function. 이 접미사는 일반적으로 새로운 프로세스에 대한 여러 매개 변수가 가변적일 때 사용됩니다.This suffix is typically used when a number of parameters to a new process is variable.

설명Remarks

_spawn 함수는 각각 새로운 프로세스를 만들고 실행합니다.The _spawn functions each create and execute a new process. 이러한 함수는 현재 사용 중인 멀티바이트 코드 페이지에 따라 멀티바이트 문자 시퀀스를 인식하며 멀티바이트 문자열 인수를 자동으로 적절하게 처리합니다.They automatically handle multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use. _wspawn 함수는 _spawn 함수의 와이드 문자 버전으로, 멀티바이트 문자열을 처리하지 않습니다.The _wspawn functions are wide-character versions of the _spawn functions; they do not handle multibyte-character strings. 그 외에는 _wspawn 함수가 _spawn의 상응 함수와 동일하게 동작합니다.Otherwise, the _wspawn functions behave identically to their _spawn counterparts.

제네릭 텍스트 라우팅 매핑Generic-Text Routine Mappings

Tchar.h 루틴Tchar.h routine _UNICODE 및 _MBCS 정의되지 않음_UNICODE and _MBCS not defined _MBCS 정의됨_MBCS defined _UNICODE 정의됨_UNICODE defined
_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

새로운 프로세스를 로드 및 실행하려면 사용할 수 있는 메모리가 충분해야 합니다.Enough memory must be available for loading and executing the new process. mode 인수는 _spawn을 실행하기 전과 실행하는 중에 호출 프로세스에 의해 수행되는 작업을 결정합니다.The mode argument determines the action taken by the calling process before and during _spawn. mode의 다음 값은 Process.h에서 정의됩니다.The following values for mode are defined in Process.h:

_P_OVERLAY
호출 프로세스를 제거하며 호출 프로세스를 새로운 프로세스와 겹쳐서 표시합니다(_exec 호출과 효과가 같음).Overlays a calling process with a new process, destroying the calling process (same effect as _exec calls).

_P_WAIT
새로운 프로세스의 실행이 완료될 때까지 호출 스레드를 일시 중단합니다(동기적 _spawn).Suspends a calling thread until execution of the new process is complete (synchronous _spawn).

_P_NOWAIT 또는 _P_NOWAITO_P_NOWAIT or _P_NOWAITO
호출 프로세스를 계속 새로운 프로세스와 동시에 실행합니다(비동기적 _spawn).Continues to execute a calling process concurrently with the new process (asynchronous _spawn).

_P_DETACH
호출 프로세스를 계속 실행합니다. 새로운 프로세스는 콘솔 또는 키보드에 대한 액세스 없이 백그라운드에서 실행됩니다.Continues to execute the calling process; the new process is run in the background with no access to the console or keyboard. 새로운 프로세스에 대해 _cwait를 호출하는 작업은 실패합니다(비동기적 _spawn).Calls to _cwait against the new process fail (asynchronous _spawn).

cmdname 인수는 새로운 프로세스로 실행되는 파일을 지정하며, 전체 경로(루트부터) 또는 부분 경로(현재 작업 디렉터리부터)를 지정하거나 파일 이름만 지정할 수도 있습니다.The cmdname argument specifies the file that is executed as the new process and can specify a full path (from the root), a partial path (from the current working directory), or just a file name. cmdname은 파일 이름 확장명을 가지지 않거나 마침표(.)로 끝나지 않으며, _spawn 함수는 먼저 .com 파일 이름 확장명을 시도한 다음 .exe 파일 이름 확장명, .bat 파일 이름 확장명을 시도하고 마지막으로 .cmd 파일 이름 확장명을 시도합니다.If cmdname does not have a file name extension or does not end with a period (.), the _spawn function first tries the .com file name extension and then the .exe file name extension, the .bat file name extension, and finally the .cmd file name extension.

cmdname에 파일 이름 확장명이 있으면 해당 확장명만 사용됩니다.If cmdname has a file name extension, only that extension is used. cmdname이 마침표로 끝나면 _spawn 호출이 파일 이름 확장명이 없는 cmdname을 검색합니다.If cmdname ends with a period, the _spawn call searches for cmdname with no file name extension. _spawnlp, _spawnlpe, _spawnvp_spawnvpe 함수는 동일한 절차를 사용하여 PATH 환경 변수로 지정된 디렉터리에서 cmdname을 검색합니다.The _spawnlp, _spawnlpe, _spawnvp, and _spawnvpe functions search for cmdname (using the same procedures) in the directories specified by the PATH environment variable.

cmdname에 드라이브 지정자 또는 슬래시가 포함되어 있으면(상대 경로) _spawn 호출이 지정된 파일만 검색하며, 경로 검색이 수행되지 않습니다.If cmdname contains a drive specifier or any slashes (that is, if it is a relative path), the _spawn call searches only for the specified file; no path searching is done.

이전에는 이러한 함수 중 일부가 성공 시 errno를 0으로 설정했지만 현재는 C 표준에 지정된 대로 성공 시 errno를 그대로 유지합니다.In the past, some of these functions set errno to zero on success; the current behavior is to leave errno untouched on success, as specified by the C standard. 이전 동작을 에뮬레이트해야 하는 경우에는 이러한 함수를 호출하기 직전에 errno를 0으로 설정하십시오.If you need to emulate the old behavior, set errno to zero just before calling these functions.

참고

적절한 오버레이 초기화 및 종료가 보장되도록 setjmp 또는 longjmp 함수를 사용하여 오버레이 루틴에 출입하지 마십시오.To ensure proper overlay initialization and termination, do not use the setjmp or longjmp function to enter or leave an overlay routine.

생성된 프로세스에 대한 인수Arguments for the Spawned Process

새로운 프로세스에 인수를 전달하려면 _spawn 호출에서 문자열에 대한 하나 이상의 포인터를 인수로 제공합니다.To pass arguments to the new process, give one or more pointers to character strings as arguments in the _spawn call. 이러한 문자열은 생성된 프로세스에 대한 인수 목록을 형성합니다.These character strings form the argument list for the spawned process. 새로운 프로세스에 대한 인수 목록을 형성하는 문자열을 합친 길이는 1024바이트를 초과할 수 없습니다.The combined length of the strings forming the argument list for the new process must not exceed 1024 bytes. 각 문자열에 대한 종결 null 문자('\0')는 개수에 포함되지 않지만 공백 문자(인수를 구분하기 위해 자동으로 삽입됨)는 포함됩니다.The terminating null character ('\0') for each string is not included in the count, but space characters (automatically inserted to separate arguments) are included.

참고

문자열에 포함된 공백으로 인해 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 _spawn를 전달하면 문자열 "hi there"는 두 개의 인수 "hi""there"를 가져오는 새 프로세스가 됩니다.Spaces embedded in strings may cause unexpected behavior; for example, passing _spawn the string "hi there" will result in the new process getting two arguments, "hi" and "there". 새 프로세스에서 "hi there"라는 파일을 열도록 의도한 것이라면 이 프로세스는 실패한 것입니다.If the intent was to have the new process open a file named "hi there", the process would fail. "\"hi there\""처럼 문자열을 따옴표로 묶으면 이러한 문제를 피할 수 있습니다.You can avoid this by quoting the string: "\"hi there\"".

중요

내용을 명시적으로 확인하지 않고 사용자 입력을 _spawn에 전달하지 마세요.Do not pass user input to _spawn without explicitly checking its content. _spawnCreateProcess를 호출합니다. 따라서 정규화되지 않은 경로 이름을 사용하는 경우 보안 취약성이 발생할 수 있음을 기억해야 합니다._spawn will result in a call to CreateProcess so keep in mind that unqualified path names could lead to potential security vulnerabilities.

인수 포인터를 별도의 인수(_spawnl, _spawnle, _spawnlp_spawnlpe) 또는 포인터 배열(_spawnv, _spawnve, _spawnvp_spawnvpe)로 전달할 수 있습니다.You can pass argument pointers as separate arguments (in _spawnl, _spawnle, _spawnlp, and _spawnlpe) or as an array of pointers (in _spawnv, _spawnve, _spawnvp, and _spawnvpe). 생성된 프로세스에 arg0 또는 argv[0] 중 하나 이상의 인수를 전달해야 합니다.You must pass at least one argument, arg0 or argv[0], to the spawned process. 규칙에 따라 이 인수는 명령줄에 입력하는 것과 같은 프로그램의 이름입니다.By convention, this argument is the name of the program as you would type it on the command line. 다른 값은 오류를 발생시키지 않습니다.A different value does not produce an error.

인수의 개수를 미리 알고 있는 경우에는 _spawnl, _spawnle, _spawnlp_spawnlpe 호출이 일반적으로 사용됩니다.The _spawnl, _spawnle, _spawnlp, and _spawnlpe calls are typically used in cases where the number of arguments is known in advance. arg0 인수는 일반적으로 cmdname에 대한 포인터입니다.The arg0 argument is usually a pointer to cmdname. arg1 - argn 인수는 새 인수 목록을 구성하는 문자열에 대한 포인터입니다.The arguments arg1 through argn are pointers to the character strings forming the new argument list. argn 다음에는 인수 목록의 끝을 표시하는 NULL 포인터가 와야 합니다.Following argn, there must be a NULL pointer to mark the end of the argument list.

새로운 프로세스에 대한 인수 개수가 가변적인 경우에는 _spawnv, _spawnve, _spawnvp_spawnvpe 호출이 유용합니다.The _spawnv, _spawnve, _spawnvp, and _spawnvpe calls are useful when there is a variable number of arguments to the new process. 인수에 대한 포인터는 argv 배열로 전달됩니다.Pointers to the arguments are passed as an array, argv. 인수 argv[0]은 일반적으로 리얼 모드에서 경로를 가리키는 포인터이거나 보호 모드에서 프로그램 이름을 가리키는 포인터입니다. argv[1]부터 argv[n]은 새로운 인수 목록을 구성하는 문자열을 가리키는 포인터입니다.The argument argv[0] is usually a pointer to a path in real mode or to the program name in protected mode, and argv[1] through argv[n] are pointers to the character strings forming the new argument list. 인수 argv[n +1]은 인수 목록의 끝을 표시하는 NULL 포인터여야 합니다.The argument argv[n +1] must be a NULL pointer to mark the end of the argument list.

생성된 프로세스의 환경Environment of the Spawned Process

_spawn 호출 실행 시 열려 있는 파일은 새로운 프로세스에서 열린 채로 유지됩니다.Files that are open when a _spawn call is made remain open in the new process. _spawnl, _spawnlp, _spawnv_spawnvp 호출에서 새로운 프로세스는 호출 프로세스의 환경을 상속 받습니다.In the _spawnl, _spawnlp, _spawnv, and _spawnvp calls, the new process inherits the environment of the calling process. _spawnle, _spawnlpe, _spawnve_spawnvpe 호출을 사용하면 envp 인수를 통해 환경 설정 목록을 전달하여 새로운 프로세스에 대한 환경을 변경할 수 있습니다.You can use the _spawnle, _spawnlpe, _spawnve, and _spawnvpe calls to alter the environment for the new process by passing a list of environment settings through the envp argument. envp 인수는 문자 포인터 배열이며, 마지막 요소를 제외한 각 요소는 환경 변수를 정의하고 null로 종료되는 문자열을 가리킵니다.The argument envp is an array of character pointers, each element (except the final element) of which points to a null-terminated string defining an environment variable. 이러한 문자열의 형식은 일반적으로 NAME=value입니다. 여기서 NAME은 환경 변수의 이름이고, value는 해당 변수가 설정된 문자열 값입니다.Such a string usually has the form NAME=value where NAME is the name of an environment variable and value is the string value to which that variable is set. value는 큰따옴표로 묶지 않습니다. envp 배열의 마지막 요소는 NULL이어야 합니다.(Note that value is not enclosed in double quotation marks.) The final element of the envp array should be NULL. envp 자체가 NULL이면 생성된 프로세스가 부모 프로세스의 환경 설정을 상속 받습니다.When envp itself is NULL, the spawned process inherits the environment settings of the parent process.

_spawn 함수는 변환 모드를 포함하여 열려 있는 파일에 대한 모든 정보를 새로운 프로세스에 전달할 수 있습니다.The _spawn functions can pass all information about open files, including the translation mode, to the new process. 이 정보는 환경의 C_FILE_INFO 항목을 통해 리얼 모드에서 전달됩니다.This information is passed in real mode through the C_FILE_INFO entry in the environment. 시작 코드는 일반적으로 이 항목을 처리한 다음 환경에서 삭제합니다.The startup code normally processes this entry and then deletes it from the environment. 그러나 _spawn 함수가 C 프로세스가 아닌 프로세스를 생성하면 이 항목이 환경에 남아 있습니다.However, if a _spawn function spawns a non-C process, this entry remains in the environment. 환경을 인쇄하면 이 항목에 대한 정의 문자열에 그래픽 문자가 표시됩니다. 이는 환경 정보가 리얼 모드에서 이진 형식으로 전달되기 때문입니다.Printing the environment shows graphics characters in the definition string for this entry because the environment information is passed in binary form in real mode. 일반 작업에서는 다른 효과가 없습니다.It should not have any other effect on normal operations. 보호 모드에서는 환경 정보가 텍스트 형식으로 전달되므로 그래픽 문자를 포함하지 않습니다.In protected mode, the environment information is passed in text form and therefore contains no graphics characters.

fflush 또는 _flushall을 사용하여 명시적으로 플러시하거나 _spawn 함수를 호출하기 전에 모든 스트림을 닫아야 합니다.You must explicitly flush (using fflush or _flushall) or close any stream before calling a _spawn function.

_spawn 루틴에 대한 호출을 통해 생성된 새로운 프로세스는 신호 설정을 유지하지 않습니다.New processes created by calls to _spawn routines do not preserve signal settings. 대신 생성된 프로세스는 신호 설정을 기본값으로 다시 설정합니다.Instead, the spawned process resets signal settings to the default.

출력 리디렉션Redirecting Output

DLL 또는 GUI 응용 프로그램에서 _spawn을 호출하며 출력을 파이프로 리디렉션하려는 경우 두 가지 옵션이 있습니다.If you are calling _spawn from a DLL or a GUI application and want to redirect the output to a pipe, you have two options:

  • Win32 API를 사용하여 파이프를 만든 다음 AllocConsole을 호출하고, 시작 구조에서 핸들 값을 설정하고, CreateProcess를 호출합니다.Use the Win32 API to create a pipe, then call AllocConsole, set the handle values in the startup structure, and call CreateProcess.

  • 그런 다음 _popen, _wpopen을 호출합니다. 이 함수는 cmd.exe /c 또는 command.exe /c를 사용하여 파이프를 만들고 앱을 호출합니다.Call _popen, _wpopen which will create a pipe and invoke the app using cmd.exe /c (or command.exe /c).

예제Example

// 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" );  
}  
child process output  
from SPAWN!  

참고 항목See Also

프로세스 및 환경 제어 Process and Environment Control
abort abort
atexit atexit
_exec, _wexec 함수 _exec, _wexec Functions
exit, _Exit, _exit exit, _Exit, _exit
_flushall _flushall
_getmbcp _getmbcp
_onexit, _onexit_m _onexit, _onexit_m
_setmbcp _setmbcp
system, _wsystemsystem, _wsystem