프로세스 : 수행 중인 프로그램의 인스턴스(instance)로서 커널오브젝트와 주소 공간으로 구성
프로세스의 상위 2GB는 커널 영역, 하위 2GB는 유저 영역
HMODULE과 HINSTANCE는 혼용 가능
GetModuleFileName()
GetModuleHandle()
GetCommandLine()
CommandLineToArgvW()
프로세스의 환경 변수
GetEnvironmentStrings()
FreeEnvironmentStrings()
GetEnvironmentVariable() : 환경 변수의 존재 여부와 값 확인
ExpandEnvironmentStrings()
SetEnvironmentVariable()
프로세스의 선호도
: 프로세스의 스레드가 가용 CPU들중 일부 CPU에서만 수행되도록 할 수 있다.
프로세스의 에러 모드
: 프로세스들은 심각한 에러를 어떻게 처리할지를 시스템에게 알려주기 위한 일련의 플래그 값을 가지고 있다
SetErrorMode()
프로세스의 현재 디렉토리와 드라이브
GetCurrentDirectory() : API
SetCurrentDirectory() : API
_chdir() : C RTL
GetFullPathName()
시스템 버전
GetVersion()
GetVersionEx()
프로세스의 생성
CreateProcess()
새로 생성된 프로세스가 완전히 초기화되기 전에 반환
그림2는 CreateProcess()의 호출에서 반환까지의 과정이다. CreateProcess()는 새로 생성된 프로세스가 완전히 초기화되기 전에 반환한다.
ProcessID, ThreadID
: 시스템 전체에 걸쳐 고유한 ID. 단순히 시스템 내에서 프로세스들과 스레드들을 쉽게 구분하기 위해 사용.
GetCurrentProcessId()
GetCurrentThreadId()
GetProcessId()
GetThreadId()
프로세스의 종료
방법.1 주 스레드의 진입점 함수 반환(추천)
방법.2 프로세스 내의 어떤 스레드가 ExitProcess() 함수를 호출
- 사용자가 ExitProcess() 호출시 C 런타임 리소스 해제가 적절하게 이루어지지 않는다. 따라서 메모리나 다른 리소스의 누수가 발생할 수 있다.
- ExitProcess()의 매개변수로 종료 코드를 설정한다.
방법.3 다른 프로세스의 스레드가 TerminateProcess() 함수를 호출
- 자신의 프로세스 뿐만 아니라 다른 프로세스까지도 종료시킬 수 있다.
- 비동기 함수이므로 프로세스의 정확한 종료 시점을 알기 위해서는 추가적인 작업이 필요하다.
- 프로세스가 사용하던 리소스는 완벽하게 정리된다.
방법.4 프로세스 내의 모든 스레드가 각각 종료
프로세스의 종료시
1) 프로세스 내에 남아 있는 스레드 종료
2) 프로세스에 할당되었던 모든 사용자 오브젝트와 GDI 오브젝트 삭제 및 모든 커널 오브젝트 파괴 (커널 오브젝트의 usage count가 0이 되는 경우에만)
3) 프로세스의 종료 코드는 STILL_ACTIVE에서 ExitProcess나 TerminateProcess 호출 시 설정한 종료 코드로 변경
4) 프로세스 커널 오브젝트의 상태가 시그널 상태로 변경
5) 프로세스 커널 오브젝트의 usage count 1 감소
프로세스 간의 자료 전송 기법
: DDE(Dynamic Data Exchange), OLE, 파이프(PIPE), 메일슬롯(mailslot), 메모리 맵 파일(MMF) 등
Child process의 독립적인 수행
Child process 생성 후 CloseHandle()을 이용하여 child process의 핸들 및 child process의 주 스레드 핸들을 해제한다.
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
상승된 권한으로 프로세스를 수행시
CreateProcess() 대신 ShellExecuteEx를 사용
프로세스를 나열할 수 있는 프로세스 상태 관련 함수
EnumProcess()
댓글 없음:
댓글 쓰기