다음을 통해 공유


_spawn, _wspawn 함수

각각의 _spawn 함수를 만들고 새 프로세스 실행:

_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

메모리가 부족 하 여 로드 하 고 새 프로세스를 실행 하는 수 있어야 합니다.mode 인수 전과 중 호출 하는 프로세스에서 수행 되는 작업을 결정 _spawn.다음 값에 대 한 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 0에서 성공 합니다. 현재 동작 상태로 두는 것 errno untouched는 C 표준에 지정 된 대로 성공 했.이전 버전의 동작 하는 경우 설정 errno 이 함수를 호출 하기 전에 0으로 합니다.

[!참고]

올바른 오버레이 초기화 및 종료 하려면 사용 하지 마십시오의 setjmp 또는 longjmp 오버레이 루틴을 입력 하는 기능입니다.

생성 된 프로세스에 대 한 인수

새 프로세스에 인수를 전달 하려면 하나 이상의 포인터 문자 문자열을 인수로 지정은 _spawn 를 호출 합니다.이러한 문자 문자열 인수 목록이 생성 된 프로세스를 형성합니다.새 프로세스에 대 한 인수 목록을 형성 하는 문자열 조합의 길이가 1024 바이트 초과할 수 없습니다.(인수를 구분 합니다 자동 삽입) 공백 문자가 포함 된 각 문자열에 대 한 종료 null 문자 ('\ 0')을 개수에 포함 되지 않습니다.

[!참고]

문자열에 포함 된 공백은 예기치 않은 동작이 발생할 수 있습니다. 예를 들어, 전달 _spawn 문자열 "hi there" 두 개의 인수를 가져오는 새 프로세스에서 발생 합니다 "hi" 및 "there".라는 파일을 열고 새 프로세스를 의도 한 경우 "hi 있을", 프로세스를 실패 하 게 됩니다.문자열을 인용 하 여 피할 수 있습니다: "\"hi there\"".

보안 정보보안 정보

사용자 입력을 전달 하지 않습니다 _spawn 명시적으로 해당 내용을 확인 하지 않고 있습니다._spawn에 대 한 호출 됩니다 오류가 따라서 조건이 지정 되지 않은 경로 이름 인해 잠재적인 보안 문제를 고려 합니다.

별도 인수 인수에 대 한 포인터를 전달할 수 있습니다 (에 _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]를 통해 argvn 새 인수 목록을 형성 문자 문자열에 대 한 포인터입니다.인수 argvn + 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 프로세스를 만들고, 환경에이 항목이 남아 있습니다.환경 정보는 리얼 모드에서 이진 형식으로 전달 되기 때문에 환경 인쇄 그래픽 문자 정의 문자열에이 항목이 표시 됩니다.다른 효과 일상적인 작업에 있어서는 안 됩니다.보호 모드 환경 정보 텍스트 형태로 전달 되 고 있으므로 그래픽 문자를 포함 합니다.

명시적으로 flush 해야 합니다 (사용 하 여 fflush 또는 _flushall) 또는 모든 호출 하기 전에 stream을 닫습니다는 _spawn 함수.

새 프로세스에 대 한 호출으로 만들어진 _spawn 루틴 신호 설정을 보존 하지 않습니다.대신 생성 된 프로세스 신호 설정을 기본 설정으로 다시 설정합니다.

출력 리디렉션

호출 하는 경우 _spawn 에서 GUI 응용 프로그램 또는 DLL 및 파이프에 출력을 리디렉션할 두 가지 옵션이 있습니다.

  • Win32 API를 사용 하 여 파이프를 만드는 데 다음 호출 AllocConsole, 핸들 값 시작 구조 및 호출에서 설정 오류가.

  • 호출 _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