DuplateHandle(), использовать в первом или втором процессе?

StackOverflow https://stackoverflow.com/questions/819710

  •  03-07-2019
  •  | 
  •  

Вопрос

Windows API DuplateHandle()http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspxТребуется дублирование дескриптора объекта и дескриптора как исходного процесса, так и другого процесса, в котором вы хотите использовать дублированный дескриптор.

Я предполагаю, что если у меня есть два НЕСВЯЗАННЫХ процесса, я мог бы вызвать DuplicationHandle() в любом из них, если у меня есть необходимые дескрипторы?

Мой вопрос касается использования канала для связи между двумя процессами для достижения этой цели с помощью события.

В первом процессе я создаюEvent().Теперь я хочу использовать WaitForSingleObject() во втором процессе.

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

В качестве альтернативы я мог бы начать с отправки дескриптора первого процесса и дескриптора события второму процессу и просто продублировать их там.

Есть ли причина, по которой я должен предпочесть одно другому?

Чтобы добавить морщину, дескриптор события фактически наследуется от родительского процесса, который фактически вызвал первый процесс (который является приложением CGI).Если этот дескриптор события был создан с помощью HANDLE_DO_NOT_DUPLICATE (что-то в этом роде), то могу ли я использовать DuscribeHandle(), чтобы дублировать его для второго процесса?

Ответ:

Что ж, я мог бы создать новое событие NAMED в первом процессе и найти его во втором процессе, как было предложено, но я пытаюсь ДУБЛИЦИРОВАТЬ событие, которое было создано в родительском процессе первого процесса, и переслать его второму процессу.Это событие не является именованным событием, поэтому мне нужно использовать DuplateHandle().

Я использую трубу для IPC.Я понимаю, что DuplateHandle() придется вызывать в первом процессе, потому что дескриптор события находится вне контекста при отправке во второй процесс.

        hProcPseudo  = GetCurrentProcess() 

    //Then call either:
        lpRealHandle = OpenProcess( PROCESS_DUP_HANDLE, 0, hProcPseudo ) 
//This fails with GetLastError= 87 - The parameter is incorrect ???
// same thing with PROCESS_ALL_ACCESS ??


    //OR
        lRet = DuplicateHandle( hProcPseudo, hProcPseudo, hProcPseudo, lpRealHandle, DUPLICATE_SAME_ACCESS, 0, 0 )

    //then I can Duplicate my Event Handle in the first thread with:
        lRet = DuplicateHandle( hLocalProcess, hEvent, lpRealHandle, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

Второй процесс преобразует свой дескриптор с помощью DuscribeHandle(), подробно описанного выше.

hProcPseudo= 4294967295

к

hProcess= 152

Затем я передаю этот дескриптор процесса первому процессу через именованный канал.В первом процессе (где дескриптор события действителен) я вызываю дублирующий дескриптор:

DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

К сожалению, я получаю ошибку:

DuplicationHandle hPipeFCGI GetLastError= 6 — дескриптор недействителен.

Дальнейшее тестирование (замена hFirstProcess) показывает, что недействителен hSecondProc!??

Большая Тайна.

Это было полезно?

Решение

Использовать именованный канал или почтовые ящики для IPC это должно надежно работать для вашей цели.Если вам нужно подождать, используйте именованные дескрипторы ожидания.

В противном случае я бы предпочел выполнить DuplicationHandle во втором процессе, чтобы правильно установить владельца дескриптора.

Другие советы

Дескриптор процесса отличается от идентификатора процесса.OpenProcess принимает идентификатор процесса.Используйте что-то вроде...

HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId());

Если я правильно понял, вы хотите синхронизировать два несвязанных процесса через одно и то же событие.Если да, вы можете использовать именованные события.

Создайте его, используя Создать событие Функция API, укажите ей имя, затем используйте второй процесс. OpenEvent API-функция, указывающая название события.

У вас есть аналогичные функции для других объектов синхронизации, таких как мьютексы (OpenMutex) или семафоры (OpenSemaphore).

  1. Каким-то образом второму процессу необходимо передать свой идентификатор первому процессу.Это можно получить через GetCurrentProcessId()
  2. Теперь первому процессу необходимо использовать этот идентификатор для получения HANDLE ко второму процессу: hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
  3. Теперь вы можете дублировать дескриптор первого процесса, используя РЕАЛЬНЫЙ дескриптор второго процесса и псевдо-дескриптор первого процесса: DuplicateHandle(GetCurrentProcess(), hEvent, hProcess, &hDupEvent, 0, FALSE, DUPLICATE_SAME_ACCESS);
  4. Не забудьте отпустить дескриптор, который вы создали с помощью OpenProcess в конце концов (я не знаю, какое это имеет значение, но вы должны...).Кроме того, отпустите ОБА дескриптора события:тот, который присвоен второму процессу, и начальный дескриптор.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top