_spawn
, _wspawn
함수
각 _spawn
함수는 새로운 프로세스를 만들고 실행합니다.
_spawnl
, _wspawnl
_spawnle
, _wspawnle
_spawnlp
, _wspawnlp
_spawnlpe
, _wspawnlpe
_spawnv
, _wspawnv
_spawnve
, _wspawnve
_spawnvp
, _wspawnvp
_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 |
새로운 프로세스를 로드 및 실행하려면 사용할 수 있는 메모리가 충분해야 합니다. mode
인수는 _spawn
을 실행하기 전과 실행하는 중에 호출 프로세스에 의해 수행되는 작업을 결정합니다. 다음 값은 mode
다음에서 정의됩니다.Process.h
값 | 설명 |
---|---|
_P_OVERLAY |
호출 프로세스를 제거하며 호출 프로세스를 새로운 프로세스와 겹쳐서 표시합니다(_exec 호출과 효과가 같음). |
_P_WAIT |
새로운 프로세스의 실행이 완료될 때까지 호출 스레드를 일시 중단합니다(동기적 _spawn ). |
_P_NOWAIT 또는 _P_NOWAITO |
호출 프로세스를 계속 새로운 프로세스와 동시에 실행합니다(비동기적 _spawn ). |
_P_DETACH |
호출 프로세스를 계속 실행합니다. 새로운 프로세스는 콘솔 또는 키보드에 대한 액세스 없이 백그라운드에서 실행됩니다. 새로운 프로세스에 대해 _cwait 를 호출하는 작업은 실패합니다(비동기적 _spawn ). |
cmdname
인수는 새로운 프로세스로 실행되는 파일을 지정하며, 전체 경로(루트부터) 또는 부분 경로(현재 작업 디렉터리부터)를 지정하거나 파일 이름만 지정할 수도 있습니다. 파일 이름 확장명이 없거나 마침표(.)_spawn
로 끝나지 않는 경우 cmdname
함수는 먼저 .com 파일 이름 확장명과 .exe 파일 이름 확장명, .bat 파일 이름 확장명 및 마지막으로 .cmd 파일 이름 확장명을 시도합니다.
cmdname
에 파일 이름 확장명이 있으면 해당 확장명만 사용됩니다. cmdname
이 마침표로 끝나면 _spawn
호출이 파일 이름 확장명이 없는 cmdname
을 검색합니다. _spawnlp
, _spawnlpe
, _spawnvp
및 _spawnvpe
함수는 동일한 절차를 사용하여 PATH
환경 변수로 지정된 디렉터리에서 cmdname
을 검색합니다.
드라이브 지정자 또는 슬래시(상대 경로인 경우)_spawn
가 포함된 경우 cmdname
호출은 지정된 파일만 검색하며 경로 검색은 수행되지 않습니다.
이전에는 이러한 함수 중 일부가 성공 시 errno
를 0으로 설정했지만 현재는 C 표준에 지정된 대로 성공 시 errno
를 그대로 유지합니다. 이전 동작을 에뮬레이트해야 하는 경우에는 이러한 함수를 호출하기 직전에 errno
를 0으로 설정하십시오.
참고 항목
적절한 오버레이 초기화 및 종료가 보장되도록 setjmp
또는 longjmp
함수를 사용하여 오버레이 루틴에 출입하지 마십시오.
생성된 프로세스에 대한 인수
새로운 프로세스에 인수를 전달하려면 _spawn
호출에서 문자열에 대한 하나 이상의 포인터를 인수로 제공합니다. 이러한 문자열은 생성된 프로세스에 대한 인수 목록을 형성합니다. 새로운 프로세스에 대한 인수 목록을 형성하는 문자열을 합친 길이는 1024바이트를 초과할 수 없습니다. 각 문자열의 종료 null 문자('\0')는 개수에 포함되지 않지만 공백 문자(인수 구분에 자동으로 삽입됨)가 포함됩니다.
참고 항목
문자열에 포함된 공백으로 인해 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 _spawn
를 전달하면 문자열 "hi there"
는 두 개의 인수 "hi"
및 "there"
를 가져오는 새 프로세스가 됩니다. 새 프로세스에서 "hi there"라는 파일을 열도록 의도한 것이라면 이 프로세스는 실패한 것입니다. "\"hi there\""
처럼 문자열을 따옴표로 묶으면 이러한 문제를 피할 수 있습니다.
Important
내용을 명시적으로 확인하지 않고 사용자 입력을 _spawn
에 전달하지 마세요. _spawn
를 호출하면 CreateProcess
정규화되지 않은 경로 이름이 잠재적인 보안 취약성을 초래할 수 있음을 명심해야 합니다.
인수 포인터를 별도의 인수(_spawnl
, _spawnle
, _spawnlp
및 _spawnlpe
) 또는 포인터 배열(_spawnv
, _spawnve
, _spawnvp
및 _spawnvpe
)로 전달할 수 있습니다. 생성된 프로세스에 하나 이상의 인수 arg0
또는 argv[0]
인수를 전달해야 합니다. 규칙에 따라 이 인수는 명령줄에 입력하는 것과 같은 프로그램의 이름입니다. 다른 값은 오류를 생성하지 않습니다.
인수의 개수를 미리 알고 있는 경우에는 _spawnl
, _spawnle
, _spawnlp
및 _spawnlpe
호출이 일반적으로 사용됩니다. arg0
인수는 일반적으로 cmdname
에 대한 포인터입니다. arg1
- argn
인수는 새 인수 목록을 구성하는 문자열에 대한 포인터입니다. argn
다음에는 인수 목록의 끝을 표시하는 NULL
포인터가 와야 합니다.
, _spawnve
, _spawnvp
및 _spawnvpe
호출은 _spawnv
새 프로세스에 대한 인수 수가 가변적인 경우에 유용합니다. 인수에 대한 포인터는 배열 argv
로 전달됩니다. 인수 argv[0]
는 일반적으로 실제 모드의 경로 또는 보호 모드의 프로그램 이름에 대한 포인터이며 argv[1]
이를 통해 argv[n]
새 인수 목록을 형성하는 문자열에 대한 포인터입니다. 인수는 인수 argv[n +1]
목록의 끝을 표시하는 포인터여야 합니다 NULL
.
생성된 프로세스의 환경
_spawn
호출 실행 시 열려 있는 파일은 새로운 프로세스에서 열린 채로 유지됩니다. _spawnl
, _spawnlp
, _spawnv
및 _spawnvp
호출에서 새로운 프로세스는 호출 프로세스의 환경을 상속 받습니다. _spawnle
, _spawnlpe
, _spawnve
및 _spawnvpe
호출을 사용하면 envp
인수를 통해 환경 설정 목록을 전달하여 새로운 프로세스에 대한 환경을 변경할 수 있습니다. envp
인수는 문자 포인터 배열이며, 마지막 요소를 제외한 각 요소는 환경 변수를 정의하고 null로 종료되는 문자열을 가리킵니다. 이러한 문자열의 형식은 일반적으로 NAME
=value
입니다. 여기서 NAME
은 환경 변수의 이름이고, 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
- 파이프를 만들고 (또는command.exe /c
)를 사용하여cmd.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" );
}
child process output
from SPAWN!
참고 항목
프로세스 및 환경 제어
abort
atexit
_exec
, _wexec
함수
exit
, , _Exit
_exit
_flushall
_getmbcp
_onexit
, _onexit_m
_setmbcp
system
, _wsystem