2009년 11월 3일 화요일

[c] Process

프로세스

실행중인 프로그램.

프로세스 생성

UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow); 
가장 간단한 프로그램 생성 API. 내부적으로 CreateProcess사용. 자동으로 프로세스 생성시까지 기다려줌 
lpCmdLine에는 실행경로를 uCmdShow에는 ShowWindow()와 같은 인자를 넣어준다 일반적으론 SW_SHOWNORMAL. 
반환값이 0일 경우 메모리나 리소스가 부족해 프로세스를 생성하지 못한경우고 
ERROR_BAT_FORMAT는 지정한 파일이나 실행파일이 아닐경우. 
ERROR_FILE_NOT_FOUND 파일이 없을 경우 
ERROR_PATH_NOT_FOUND 경로가 없을 경우 
DWORD LoadModule(LPCSTR lpModuleName, LPVOID lpParameterBlock); 
첫번째 인자에는 실행파일 이름을 두번째 인자는 밑의 구조체를 만들어 넣어준다. 
 
typedef struct tagLOADPARMS32 { 
        LPSTR lpEnvAddress;      // 환경 문자열 ?-_-? 
        LPSTR lpCmdLine;         // 커맨드라인 
        LPSTR lpCmdShow;         // CmdShow값  
        DWORD dwReserved; 
} LOADPARMS32; 
 
역시나 WinExec와 같이 16비트 함수에 더 복잡하기 때문에 거의 쓸일 없음. 
BOOL CreateProcess( 
        LPCTSTR lpApplicationName,                    // 프로그램 이름. 밑의 명령행으로 지정가능하기 때문에 NULL 가능. 
        LPTSTR lpCommandLine,                         // 명령행 인수를 지정. 역시나 위에 지정했으면 NULL가능. 둘중하나는 NULL이 아니어야 한다. 
        LPSECURITY_ATTRIBUTES lpProcessAttributes,    // 보안 속성을 정하는 SECURITY_ATTRIBUTES 구조체이다. NULL로 디폴트설정 가능. 
        LPSECURITY_ATTRIBUTES lpThreadAttributes,     // 보안 속성을 정하는 SECURITY_ATTRIBUTES 구조체이다. NULL로 디폴트설정 가능 
        BOOL bInheritHandles,                         // 핸들을 상속받을 수 있는지 설정. 만약 TRUE이면 상속가능한 열려진 핸들은 모두 차일드로 상속됨. 
        DWORD dwCreationFlags,                        // 우선권 설정. OR연산으로 중복 조합 가능. 설명 밑에. 
        LPVOID lpEnvironment,                         // 환경 블럭이라는데 그냥 NULL로 
        LPCTSTR lpCurrentDirectory,                   // 작업 디렉토리 설정. NULL로  
        LPSTARTUPINFO lpStartInfo,                    // 이 구조체의 cb멤버에는 구조체의 크기가 대입 되어 있어야 한다. 특별한 일이 없으면 0으로 초기화 되어야 한다. 
        LPPROCESS_INFOMATION lpProcessinfomation      // 생성된 프로세스의 정보를 대입받기 위한 구조체이며 생략 불가능. 
); 
반환값은 0이면 에러. 아닐경우 GetLastError함수로 살펴 보아야 한다. 
 
    DWORD dwCreationFlags의 속성 
 
    REALTIME_PRIORITY_CLASS 최상위 우선권 
    HIGH_PRIORITY_CLASS     상위 우선권 
    ABOVE_PRIORITY_CLASS    상위 우선권 
    NORMAL_PRIORITY_CLASS   보통 우선권 
    BELOW_PRIORITY_CLASS    하위 우선권 
    IDLE_PRIORITY_CLASS     최하위 우선권 
 
    DWORD GetPriorityClass(HANDLE hProcess); 
      우선권 반환 
    BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass); 
      우선권 설정 
 
 
 
typedef struct _STARTUPINFO {  
    DWORD   cb;                    // 이 구조체의 크기를 넣어준다. 
    LPTSTR  lpReserved;  
    LPTSTR  lpDesktop;  
    LPTSTR  lpTitle;  
    DWORD   dwX;  
    DWORD   dwY;  
    DWORD   dwXSize;  
    DWORD   dwYSize;  
    DWORD   dwXCountChars;  
    DWORD   dwYCountChars;  
    DWORD   dwFillAttribute;  
    DWORD   dwFlags;               // 밑에 
    WORD    wShowWindow;  
    WORD    cbReserved2;  
    LPBYTE  lpReserved2;  
    HANDLE  hStdInput;  
    HANDLE  hStdOutput;  
    HANDLE  hStdError;  
} STARTUPINFO, *LPSTARTUPINFO;  
 
STARTF_FORCEONFEEDBACK  피드백 커서 사용. 피드팩 커서란 프로그램 초기화때 나타나는 화살표 밑에 모래시계가 있는 커서 
STARTF_FORCEOFFFEEDBACK 피드백 커서 사용안함. 
STARTF_RUNFULLSCREEN    콘솔프로그램을 전체화면 모드로 실행. GUI프로그램에는 적용 되지 않음.  
STARTF_USECOUNTCHARS    dwXCountChars 멤버로 콘솔프로그램의 문자폭. dwYCountChars멤버로 문자의 높이 지정. GUI프로그램에는 적용 되지 않음. 
STARTF_USEFILLATTRIBUTE dwFillAttribute 멤버로 콘솔 프로그램의 전경, 배경 색상 지정 FOREGROUND_BLUE, BACKGROUND_RED등.. 
STARTF_USEPOSITION      dwX, dwY 멤버로 시작할 프로그램의 위치 지정 
STARTF_USESHOWWINDOW    wShowWindow 멤버가 지정하는 대로 윈도우를 보여줌. 
STARTF_USESIZE          dwXSize, dwYSize 멤버가 지정하는대로 크기를 지정함 
STARTF_USESTDHANDLES    표준입력, 표준출력, 표준에러핸들을 배치함. 먼저 CreateProcess의 bInheritHandles가 True여야함  
 
GUI프로그램은 dwFlags, dwX, dwY, dwXSize, dwYSize를 사용할수 있다.. 
 
크기나 위치를 지정하기 위해서는 목적 프로그램의 크기나 위치에 CW_USEDEFAULT로 설정 되어 있어야 한다. 
 
void GetStartupInfo(LPSTARTUPINFO lpStartupInfo); 
생성된 프로세스으 정보를 얻을수 있다. 
 
typedef struct _PROCESS_INFORMATION {  
        HANDLE hProcess;    // 프로세스 핸들 
        HANDLE hThread;     // 스레드 핸들 
        DWORD dwProcessId;  // 프로세스 ID 
        DWORD dwThreadId;   // 스레드 ID 
} PROCESS_INFORMATION;  
 
CreateProcess는 WinExec와 다르게 바로 리턴한다. 이 경우 FindWindow함수로 못찾을 경우가 있는데 이럴때는 
DWORD WaitForInputIdle(HANDLE hProcess, DWORD dwMiliseconds); 로 실행이 끝날때 까지 기다려 줘야 한다. 
hProcess로는 CreateProcess함수로 생성시킨 핸들, dwMiliseconds는 기다리는 시간인데 INFINITE로 무한대로 기다릴수 있다. 

프로세스 종료

void ExitProcess(UINT uExitCode); 
이 함수가 호출되는 프로세스는 정리작업에 들어가 즉각 종료된다.  
1 종료 순서는 우선 연결된 DLL을 종료를 위해 DllMain()함수가 호출되며 DLL은 스스로 정리작업을 한다.  
2 그리고 모든 핸들을 닫고 
3 실행중인 모든 스레드를 닫는다. 
4 프로세스 커널 객체와 스레드 객체는 신호상태가 되며 이 객체를 기다리는 다른 프로세스는 대기상태를 해제할수 없다. 
5 프로세스 종료코드는 STILL_ACTIVE에서 ExitProcess가 지정한 종료값이다. 
이 함수가 PostQuitMessage()와 다른 점은 바로 종료된다는 점이다. 
BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode); 
핸들을 가지므로 자기가 아닌 다른 프로세스도 강제로 종료 시킬수 있다. 
종료될때 ExitProcess와 같은 종료순서를 따르나 큰 메모리나 파일을 열어 두고 종료할 경우 Data를 잃어 버릴수도 있다. 

댓글 없음:

댓글 쓰기