본문 바로가기
Computer/OS

프로세스의 생성

by 이재만박사 2016. 10. 13.

한 프로그램에서 다른 프로그램을 실행할 때 WinAPI의 프로세스 생성 함수 사용


프로세스를 생성하는 가장 쉽고도 간단한 함수


UINT WinExec( LPCTSTR lpCmdLine, UINT uCmdShow );


lpCmdLine - 실행하고자 하는 프로그램의 이름

uCmdShow - 프로그램 실행 직 후 프로그램이 어떻게 보일지 결정


SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOW, SW_HIDE 등


실행 파일만 주어졌을 때 다음 순서대로 실행 파일의 위치 검색하여 발견된 실행 파일을 실행


1. 프로그램이 실행된 디렉토리

2. 현재 디렉토리

3. 시스템 디렉토리

4. 윈도우즈 디렉토리

5. PATH 환경 변수가 지정하는 디렉토리들


이 검색 경로에 있는 실행 파일이면 드라이브, 디렉토리 이름을 생략하고 실행 파일 이름만 지정 가능

그렇지 않으면 실행파일이 있는 절대 경로를 조사해서 정확한 경로를 지정


프로그램 리턴 값


0 - 메모리나 리소스가 부족하여 프로세스 생성 못함

ERROR_BAD_FORMAT - 지정한 파일이 실행 파일이 아님

ERROR_FILE_NOT_FOUND - 파일이 없음

ERROR_PATH_NOT_FOUND - 경로가 없음


리턴값보다 중요한 것은 이 함수가 리턴하는 시기


프로세스 생성 과정


1. 주소 공간을 할당

2. 주 스레드 생성

3. 관련 DLL 을 모두 읽어오고 초기화


WinExec 는 생성된 프로세스가 처음으로 GetMessage( ) 함수를 호출할 때 리턴

즉 새 프로세스가 일련의 초기화 작업을 마무리 하고 스스로 메시지를 처리할 수 있을 때 비로소 리턴


WinExec 는 프로세스 완료 후에 리턴하기 때문에 에러가 없으면 바로 

FindWindow( )로 생성된 프로세스의 메인 윈도우를 찾을 수도 있고 SendMessage( ) 로 메시지를 보낼 수도 있음

즉 프로세스 생성 직후 두 프로세스끼리 안전하고 완벽한 상호 작용 가능


CreateProcess( ) 는 그렇지 않음




프로세스를 생성하는 두 번째 함수


LoadModule(LPCTSTR lpModuleName, LPVOID lpParameterBlock);








댓글