Использование объекта события в межпроцессном режиме - PullRequest
3 голосов
/ 09 ноября 2010

Я пытаюсь использовать объект события в среде win32 для синхронизации двух процессов. Ниже приведен упрощенный код двух программ.

// process1
int main()
{
    HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Hello"));
    WaitForSingleObject(h, INFINITE);
//  RunProcess(L"process2.exe", L"");
}

// process2
int main()
{
    HANDLE h = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("Hello"));
    SetEvent(h);    
}

Это довольно просто и хорошо работает, когда два процесса запускаются независимо. Однако он не работает, когда процесс 1 запускает процесс 2 как дочерний процесс (что прокомментировано в приведенном выше коде) - вызов SetEvent завершается неудачно. В чем причина и решение этой проблемы?

Ответы [ 3 ]

3 голосов
/ 09 ноября 2010

Ваш код должен проверять и обрабатывать ошибки. И CreateEvent, и OpenEvent вернут NULL, если они потерпят неудачу, в этом случае вам нужно проверить ошибку, используя GetLastError.

Ваши звонки на номера WaitForSingleObject и SetEvent также должны проверяться в соответствии с документами MSDN.

Порядок, в котором вам нужно выполнять действия в родительском процессе:

  • CreateEvent
  • Запустить дочерний процесс
  • WaitForSingleObject.

В противном случае вы столкнетесь с проблемой, вызванной @Mark Tolonen.

Было бы также лучше установить тайм-аут на ожидание, чтобы обработать случай, когда дочерний процесс не запускается, неожиданно завершает работу или зависает.

Альтернативный подход, если вы намереваетесь использовать это отношение родитель / потомок, состоит в том, чтобы разрешить наследование дескриптора события. Тогда событие не нужно называть по имени, и никто другой не может «присесть» на него в DoS-атаке на ваши приложения. Вы можете передать значение дескриптора дочернему элементу в качестве параметра командной строки. Это делается с помощью поля bInheritHandle в параметре eventAttributes для CreateEvent.

Булево значение, которое указывает, возвращенный дескриптор наследуется, когда новый процесс создан. Если это член ИСТИНА, новый процесс наследует ручку.

2 голосов
/ 29 апреля 2011

У вас есть дескриптор безопасности NULL, который, как говорится в документации, не может позволить дескриптору наследоваться дочерними процессами, а именно:

If this parameter is NULL, the handle cannot be inherited by child processes

Может быть, вам нужно создать правильный дескриптор безопасности?

2 голосов
/ 09 ноября 2010

Ты уверен?Как написано, если process1 создает process2 в текущем местоположении, он никогда не создаст process2, потому что он всегда будет ждать запуска события.Сначала создайте process2, затем подождите, пока событие не будет установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...