728x90

커널 오브젝트의 두가지 상태

커널 오브젝트는 특정 상황에 따라 두가지 상태를 지닌다. Signaled 상태(신호를 받은 상태)와 Non-signaled 상태(신호를 받지 않은 상태)이다.

 

커널 오브젝트의 상태 정보는 커널오브젝트를 구성하는 멤버 변수중 커널 오브젝트의 상태정보를 담당하는 변수에 저장된다. Non-Signaled 상태라면 FALSE, Signaled 상태라면 TRUE 값을 지니게 된다.

 

프로세스 커널 오브젝트 상태

1.프로세스 커널 오브젝트는 오브젝트가 생성될 때 만들어진다.

2.처음 커널 오브젝트가 생성되면 커널오브젝트의 상태는 Non-Signaled 상태이다.

3.프로세스가 종료되면 프로세스 커널오브젝트의 상태는 Signaled 가 된다.

프로세스가 실행중일 때에는 프로세스 커널 오브젝트의 상태가 Non-Signaled 이고 프로세스가 종료되면 운영체제에 의해 Signaled 상태가 된다.

 

 

Signaled 상태에서  Non-Signaled 상태로의 전환은 일어날 수 없다.

종료된 프로세스가 다시 시행되면 Signaled 에서 Non-Signaled상태가 되겠지만 종료된 프로세스는 다시 실행을 재개하지 못한다. 즉 프로세스 커널 오브젝트의 상태는 일단 Signaled가 되면 절대로 다시 Non-Signaled 상태로 변경되지 않는다.

 

커널 오브젝트의 상태를 확인하는 용도의 함수

핸들을 인자로 전달해서 커널 오브젝트의 상태를 확인하는 함수 WaitForSingleObject

DWORD WaitForSingleObject(

      HANDLE hHandle,

      DWORD dwMilliseconds

);

 

1.hHandle : 상태 확인을 원하는 커널 오브젝트의 핸들을 인자로 전달한다.

2.dwMilliseconds : hHandle이 가리키는 커널오브젝트가 Signaled 상태가 되었을 때 반환한다. 이 함수는 커널 오브젝트가 Signaled 상태가 될때까지 기다리는 함수이다. dwMilliseconds는 커널 오브젝트가 Signaled상태가 될때까지 기다릴 수 있는 최대 시간을 밀리 세컨드(Milliseconds)단위로 지정하는 용도로 사용되는 인자다. 상수 INFINITE를 인자로 전달하면, 커널 오브젝트가 Signaled 상태가 될때까지 반환하지 않고 무한정 기다린다.

 

WaitForSingleObject함수의 반환 결과

      vlaue                                      의미

WAIT_OBJECT_O                     커널 오브젝트가 Signaled 상태가 되었을 때 반환되는 값

WAIT_TIMEOUT                      커널 오브젝트가 Signaled 상태가 되지않고, dwMilliseconds인자를 통해서 설정된                                                  시간이 다 된 경우 반환되는 값

WAIT_ABANDONED                 오류 발생에 의해서 반환되는 경우에 반환되는 값

 

두번째 커널 오브젝트의 상태를 확인하는 함수

WaitForMultipleObject 함수

DWORD WaitForMultipleObjects(

           DWORD nCount,

           const HANDLE * lpHandles,

           BOOL bWaitAll,

           DWORD dwMilliseconds

);

1.nCount :  배열에 저장되어 있는 핸들 개수를 전달한다.

2.lpHandles : 핸들을 저장하고 있는 배열의 주소 정보를 전달한다. 이 주소를 시작으로 nCount개의 핸들이 대상이된다.

3.bWaitAll : TRUE 전달시 관찰대상 모두 Signaled 상태가 되기를 기다리고, FALSE 전달시 하나라도 Signaled 상태가                      되면 반환할 것인지를 전달한다.

4.dwMilliseconds : 타임 아웃을 설정하는 용도로 사용된다.

 

커널 오브젝트에 존재하는 종료코드(Exit Code)

프로세스가 종료되면서 전달하는 값을 종료코드(Exit Code)라 하고, 이 종료코드는 종료되는 프로세스의 커널 오브젝트에 저장된다. 커널 오브젝트에 저장되는 종료코드는 부모 프로세스가 GetExitCodeProcess함수 호출을 통해 자식 프로세스의 종료코드를 얻을 수 있다.

 

WaitForSingleObject 함수의 유용성

자식프로세스의 종료코드를 얻기 위해서는 자식프로세스들이 종료된 상태여야 한다. 부모 프로세스 입장에서 자식프로세스가 종료될때까지 기다렸다가 GetExitCodeProcess함수를 호출해야 한다. 부모프로세스가 자식프로세스 종료때까지 기다린느 것은 WaitForSingleObject 함수를 사용하면 충분히 가능하다.

 

CreateProcess 함수를 통해 얻게되는 핸들을 이용하여 WaitForSingleObject를 호출하여 INFINITE를 인자로 주면 부모프로세스는 자식프로세스가 종료될때 까지 블로킹(Blocking)상태에 놓인다. 이후 자식프로스세가 종료되면 자식 프로세스의 커널 오브젝트는 Signaled 상태가 되고 부모 프로세스는 블로킹 상태를 빠져 나와서 나머지 부분을 실행한다.

 

728x90

+ Recent posts