'API 프로세스'에 해당되는 글 1건

  1. 2010.02.10 프로세스
정의  - 실행중인 프로그램 (파일이 실행되어 메모리에 적재되면 프로세스가 된다.)

내용 -  프로세스는 실행중인 프로그램이지만 작업의 주체는 아니다. 작업은 프로세스 내의 쓰레드가 담당한다.

프로세스는 각각 4GB의 주소 공간과 파일, 메모리, 스레드 등의 객체들을 소유하며 프로세스가 종료될 때 프로세스가 소유한 모든 자원은 운영체제의 의해 파괴된다. 모든 것은 프로세스의 의해 소유되며 스레드는 윈도우와 메시지 큐, 스택만 소유한다. 객체간의 소유 관계는 프로세스 > 스레드 > 윈도우 로 정리할 수  있다.



<프로세스 생성 함수> - WinExec, CreateProcess.

 

UINT WinExec (LPCSTR lpCmdLine, UINT uCmdShow)

한 프로그램에서 다른 프로그램을 실행하고자 할 때는 Win32 AP가 제공하는 프로세스 생성 함수를 사용한다. 프로세스를 생성하는 가장 간단한 함수는 WinExec이다

lpCmdLine

실행 시키고자 하는 프로그램의 이름, (완전 경로를 줄 수 있다.)

uCmdShow

실행 직 후 프로그램이 어떻게 보일지 지정.(기본 SW_SHOWNORMAL)

Ex)

UINT WinExec(“Notepad.exe”,SW_SHOWNORAML);

 

BOOL CreateProcess (LPCTSTR lpApplicationName, LPTSTR lpCmdLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,  DWROD dwCreationFlags,

LPVOID lpEnvironment,  LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation  );

프로세스를 생성하는 함수. 새로 만든 프로세스의 메인 윈도우가 어떻게 초기화될지 정하는 구조체인STARTUPINFO 구조체와 생성된 프로세스의 정보를 대입 받기 위한 구조체인 PROCESS_INFORMATION 구조체가 꼭 필요하다.[출처] [API] 프로세스|작성자 흡연토끼

à10개의 인수를 가지고 있는데 이 중 반드시 필요한 인수는 4가지 뿐이며 나머지는 NULL

줄 수 있다.

 

lpApplicationName

실행하고자 하는 프로세스 이름

lpCmdLine

명령행 인수를 지정한다.

bInheritHandles

상속 가능한 핸들에 대해 자식 프로세스에게 상속할지를 결정.(null)

lpStartupInfo

메인 윈도우의 초기화를 정하는 구조체.

lpProcessInformation

생성된 프로세스의 정보를 받기위한 구조체.

EX)

CreateProcess(NULL,”NotePad.exe”,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);






프로세스가 자기 자신을 종료하는 가장 간단하고 일반 적인 방법은 WM_CLOSE메시지를 보내거나 DestoryWindow로 메인윈도우를 파괴하는것이다. 이때 WM_DESTORY에서 PostQuitMessage를 호출하여 메시지 루프를 종료한다.

 

 

<프로세스 종료 함수>

 

- void ExitProcess(UNIT uExitCode);

 함수가 호출되면 프로세스는 정리 작업이 들어가고 즉각 종료된다.

 

     프로세스와 연결된 모든 DLL을 종료시키기 위해 각 DLL DllMain함수가 호출되며

        dll들은 스스로 정리 작업을 한다.

     열려진 모든 핸들을 닫는다.

     실행중인 모든 스레드를 종료한다.

     프로세스 커널 객체와 스레드 객체는 신호상태가 되며 이 객체를 기다리는 다른 프로세스는 대기상태를 해제한다.

     프로세스의 종료코드는 STILL_ACTIVE에서 ExitProcess가 지정한 종료값이 된다.

 

-BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode);

 프로세스 외부에서 다른 프로세스를 종료하는 메소드, ExitProcess에 비해 종료 대상이 되는 프로세스의 핸들을 가지므로 자기 자신이 아닌 다른 프로세스를 강제로 종료 시킬 수 있다.

 

à TerminateProcess ExitProcess함수보다 더 위험하다. 이는 함수가 호출될 때는 동일한 작업이 수행되나 TerminateProcess는 연결된 DLL에게 종료 사실을 통지하지 않는다. 때문에 TerminateProcess함수로 강제로 프로세스를 종료한다면 정보를 잃어버리게 될 수 있다.


<프로세스 핸들>

윈도우즈는 GDI, USER, KERNEL의 세 가지 주요 DLL로 구성되어 있다. 각 모듈은 여러 종류의 객체를 관리하며 관리의 편의를 위해 핸들을 사용한다. 객체는 시스템 리소스를 나타내는 일종의 데이터 구조체이며 이 구조체들은 보통 덩치가 크기 때문에 좀 더 간단한 32비트 정수값의 핸들로 관리된다. 각 모듈별 객체에는 어떤 것들이 있고 특징은 어떤지 정리해보자.

모듈

객체

특징

USER

윈도우, 커서, 캐럿, 아이콘

한 오브젝트에 하나의 핸들. 시스템 전역적

GDI

, 브러시, 비트맵, 팔레트

한 오브젝트에 하나의 핸들. 프로세스 지역적

KERNEL

파일, 프로세스, 스레드, 이벤트

보안 적용. 프로세스 한정적


USER 객체 - ProA에서 윈도우를 만들고 핸들을 받으면 그 핸들을 ProB에게 전달하면 ProB는 윈도우 핸들을 사용하여 ProA가 만든 윈도우를 마음대로 만질수 있다.

GDI객체 - ProA에서 펜을 만들고 hPen 핸들을 발급받아서 ProB로 보냈다고해서 ProB가 이 펜을 사용할 수 없다. GDI 객체는 언제든지 원하는대로 생성할 수 있는데다 공유할 필요가 없기 때문에 프로세스 지역적이다.

커널객체 - 윈도우즈는 멀티 유저를 지원하는데 파일이나 프로그램 모두 소유자를 지정할 수 있고 소유자만 액세스 하도록 권한을 설정할 수 있다. 그래서 커널 객체를 만드는 CreateProcess, CreateFile, CreateMutex 등의 함수들은 모두 보안 속성을 인수로 가진다.

이런 보안상의 이유로 커널 객체는 프로세스 한정적이다.
(프로세스 한정적 - 한 프로세스가 만든 핸들은 다른 프로세스에서 곧바로 사용할 수 없되 대신 다른 프로세스가 같은 객체를 다시 오픈 하여 또 다른 핸들을 사용할 수 있다는 뜻이다.)

ProA가 ProC를 생성해서 ProC의 핸들을 받는다. 그리고 ProB에게 ProC의 핸들을 보내준다. 하지만 ProB는 ProC를 열 수 있는 권한이 아직 있는지 없는지 확인이 안되었기 때문에 사용못한다. ProB가 ProC를 액세스하고 싶다면 다음 함수로 프로세스의 ID로부터 프로세스 핸들을 다시 열어야 한다. 

ID
- 프로세스간의 구분을 위한 중복되지 않는 식별값일 뿐이며 ID로부터 직접 프로세스를 제어할 수는 없다. ID로부터 핸들을 발급받아야만 비로소 이 객체를 제어할 수 있다.

<프로세스의 핸들 얻는 함수>

 

HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL blnheritHandle, DWORD dwProcessld)

dwDesiredAccess

Flag 접근

blnheritHandle

Flag 상속

dwProcessld

프로세스 identifier

 

<자기자신의 프로세스 핸들 얻는 함수>

HANDLE GetCurrentProcess (VOID);  : 필요한 인자는 없으며 자기자신의 프로세스 핸들 값을 반환한다.




<
프로세스 종료 상태를 구하는 함수>
                  
BOOL GetExitCodeProcess (HANDLE hProcess, LPWORD lpExitCode);

프로세스의 종료 상태를 구하는 인수로 프로세스의 핸들을 주면 이 프로세스의 종료 상태를 lpExitCode에 리턴 해준다.

hProcess

프로세스의 핸들

lpExitCode

DWORD의 포인터형. 프로세스의 상태코드가 넘어온다.        성공 1, 실패 0반환.

 

<사용 예>

static DWORD ProcID = 0;

static HANDLE hProc = 0;

 

switch (iMessage) {

           case WM_USER:

                     ProcID = wParam;

                     hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);

                     return 0;

           case WM_LBUTTONDOWN:

                     GetExitCodeProcess(hProc, &ExitCode);

           }



.[출처] [API] 프로세스|작성자 흡연토끼

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

메시지 기본원리  (0) 2010.02.13
ATOM  (0) 2010.02.09
간단한 DLL 예제  (1) 2010.02.03
리스트뷰  (0) 2010.02.03
WM_USER And WM_APP  (0) 2010.02.02
Posted by 아몰라
이전버튼 1 이전버튼