2017-12-14 29 views
0

저는 현재 설계중인 IPC 시스템에 여러 프로세스가 있습니다. 각 프로세스는 자체 메모리 영역으로 FileMappingMapViewOfFile을 만듭니다. 또한 각 프로세스는 이미 생성 한 FileMappingMapViewOfFile을 관리하는 두 개의 세마포를 만듭니다. Windows 핸들은 모든 참조가 릴리스 될 때까지 대기합니다.

, 나는이 문제를 설명 3 개 프로세스를 가정합니다 :

  1. ProcessAFileMapping, MapViewOfFile 두 세마포어를 생성한다.

  2. ProcessBProcessCProcessA과 유사합니다.

  3. ProcessAProcessB에게 뭔가를 보내려고합니다. FileMappingMapViewOfFile에 연결하고 ProcessB의 두 세마포를 연결하여 보내려는 모든 내용을 보냅니다.

  4. ProcessB은 통신을 다시 열려고합니다. FileMappingMapViewOfFile 및 두 개의 세마포를 닫습니다. 프로세스는 AC으로 종료 메시지를 보냅니다. 프로세스 AC이 닫기 메시지를 수신하면 핸들은 FileMapping, MapViewOfFileProcessB과 연결된 두 개의 세마포를 닫습니다.

  5. ProcessB 모든 핸들이 닫히고 다시 열려고합니다. MapViewOfFile을 만들려고하면 AC 프로세스가 아직 핸들을 닫지 않아 ProcessB이되지 않습니다. 이 ProcessB 자신의 핸들을 닫습니다 프로세스 A와 C에 대한 시간을 제공하기 위해 폐쇄 될 때

는 지금 (임시 수정으로), 나는이 100ms에 대한 ProcessB 잠을시키고있다. 그러나, 나는 수면을 포함하지 않는 해결책을 원합니다.

핸들의 (FileMapping, MapViewOfFile 두 세마포어)에 모든 참조가 다른 모든 프로세스에 의해 출시되면 알 수 ProcessB위한 방법이 있나요?있는 경우 어떻게 기다려야하나요?

+0

** 모든 핸들 참조 ** 여기에 귀하가 의미하는 바는 무엇입니까? – RbMm

+0

Microsoft의 설명서에 따르면 개체는 핸들에 대한 모든 참조가 닫힌 경우에만 닫힙니다. 객체에서'CloseHandle'을 호출하면, 그 객체에 대한 참조의 수만 감소합니다. 참조 카운트가 '0'에 도달하면 객체가 닫히고 다시 생성 할 수 있습니다. 참조 횟수를 확인할 수있는 방법이 있는지 알고 싶습니다. – Everyone

+0

아니요, 일반적인 말로 표현하면 어떻게 구현합니까? – RbMm

답변

1

확실히 winapi 기능이 없습니다. 당신은 오직 (명명 된) 객체에 대한 핸들을 열려고 시도 할 수 있으며, 적절한 이유로 실패 하는지를 볼 수 있습니다.

그래서 가장 간단한 해결 방법은 Sleep(0) 또는 이와 유사한 것으로 루프를 시도하는 것입니다. 이 특정 목적을 위해 추가 동기화 객체 (예 : ProcessB이 열 수있는 이름이 자동 재설정 된 이벤트)와 WaitFor....을 추가 할 수도 있습니다.

+0

개념적으로 이는 매우 유용합니다. 이것을 바로 잡으려면 핸들을 닫은 후에 내가 성공할 때까지 다시 열려고합니다. 성공하면 다른 모든 프로세스가 핸들을 릴리스 했으므로 핸들을 놓은 유일한 사람이므로 닫는 것입니다. 그들은 다시 모든 참조가 공개된다는 것을 의미합니다. 이 올바른지? – Everyone

+0

일종. 당신은 또한 그 반대의 경우도 있습니다 : 실패 할 때까지'OpenFileMapping'을 호출하십시오 - 이것은 마지막 핸들이 닫혔다는 것을 의미합니다. – valdo

+0

감사합니다. 나는 이것을 시도 할 것이고 잘하면 그것은 잘될 것이다. – Everyone