ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2015.03.08 메일슬롯 IPC
    Legacy/뇌자극 - WinSysProg 2015. 3. 8. 15:05
    728x90

    메일슬롯과 IPC에 대한 고찰

    메일슬롯은 한쪽 방향으로만 메시지를 전달할 수 있다.

    따라서 두 프로세스가 서로 메시지를 주고 받을 수 있는 채팅 프로그램을 구현하기 위해서는 두 개의 메일 스롯을 생성해야함.

    채팅 프로그램 같은 양방향 통신을 구현하기 위해서는 IPC가 적절함.

    메일슬롯은 브로드캐스팅 방식의 통신을 지원.



    메일슬롯은 생성과 동시에 Usage Count가 1이다. 참조하는 프로세스가 메일슬롯을 생성한 프로세스 하나이기 때문이다. 자식 프로세스의 경우에는 생성과 동시에 참조하는 프로세스가 둘이 되기 때문에 2가 되는 것이다. 메일슬롯뿐만 아니라, 프로세스와 쓰레드를 제외한 다른 모든 커널 오브젝트는 생성과 동시에 Usage Count가 1이 된다.



    Signaled vs Non-Signaled

    커널오브젝트는 두 가지 상태(State)를 가진다. 하나는 Signaled 상태(신호를 받은 상태)이고, 또 하나는 Non-Signaled 상태(신호를 받지 않은 상태)이다. 커널 오브젝트를 구성하는 멤버변수 중 하나가 커널 오브젝트의 상태 정보를 담당한다. 만약에 Non-Signaled 상태라면 이 멤버 변수는 FALSE 값을 지니게 되고 Signaled 상태라면 TRUE 값을 지니게 된다.


    처음 커널 오브젝트가 생성되면 커널 오브젝트의 상태는 Non-Signaled 상태에 놓이게 된다. 그러다가 프로세스가 종료되면 Signaled 상태로 변경된다. 이는 일종의 약속이다. 반대로 Signaled 상태에서 Non-Signaled 상태로 변경되는 시점은 언제이겠는가? 아마도 종료된 프로세스가 다시 실행을 재개하면 Non-Signaled 상태가 될 것이다. 하지만! 문제는 종료된 프로세스는 다시 실행을 재개하지 못한다는 데 있다. 즉, 프로세스 커널 오브젝트의 상태는 일단 Signaled가 되면 절대로 다시 Non-Signaled 상태로 변경되지 않는다.



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

    DWORD WaitForSingleObject ( 

    HANDLE hHandle,

    DWORD dwMilliseconds

    );

    If the function fails, the return value is WAIT_FAILED.


    주목할건 두번째 인자인 dwMilliseconds인데, 커널 오브젝트가 Signaled 상태가 될 때까지 기다릴 수 있는 최대 시간을 밀리세컨드 단위로 지정하는 용도로 사용되는 인자이다. 상수 INFINITE를 인자로 전달하면, 커널 오브젝트가 Signaled 상태가 될 때까지 반환하지 않고 무한정 기다린다.

    반환값들...

    WAIT_OBJECT_0 : 커널 오브젝트가 Signaled 상태가 되었을 떄 반환되는 값

    WAIT_TIMEOUT : 커널 오브젝트가 Signaled 상태가 되지 않고, 설정된 시간이 다 된 경우에 반환되는 값

    WAIT_ABANDONED : 소유 관계와 관련하여 함수가 정상적이지 못한 오류에 의해서 반환하는 경우에 반환되는 값(추후 설명)


    만약 상태를 확인하고자 하는 커널 오브젝트가 둘 이상이고, 이들의 핸들이 배열로 묶여 있다면 다음 함수를 활용하는 것이 편리하다.

    DWORD WaitForMultipleObjects(

    DWORD nCOUNT,

    const HANDLE* lpHandles,

    BOOL bWaitAll,

    DWORD dwMilliseconds

    );

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

    lpHandles : 핸들을 저장하고 있는 배열의 주소 정보를 전달.



Designed by Tistory.