Как создать наследуемый семафор в .NET? - PullRequest
3 голосов
/ 29 марта 2010

Я пытаюсь создать объект семафор Win32, который наследуется . Это означает, что любые дочерние процессы, которые я запускаю, могут автоматически иметь право на один и тот же объект Win32.

Мой код в настоящее время выглядит следующим образом:

Semaphore semaphore = new Semaphore(0, 10);
Process process = Process.Start(pathToExecutable, arguments);

Но объект семафора в этом коде не может использоваться дочерним процессом.


Код, который я пишу, - это порт, работающий на C ++. Старый код C ++ достигает этого следующим образом:

SECURITY_ATTRIBUTES security = {0};
security.nLength = sizeof(security);
security.bInheritHandle = TRUE;
HANDLE semaphore = CreateSemaphore(&security, 0, LONG_MAX, NULL);

Затем, когда вызывается CreateProcess, аргумент bInheritHandles устанавливается на TRUE.

(И в случае C #, и в C ++ я использую один и тот же дочерний процесс (это C ++). Он принимает идентификатор семафора в командной строке и использует значение непосредственно при вызове ReleaseSemaphore.)


Я подозреваю, что мне нужно построить специальный объект SemaphoreSecurity или ProcessStartInfo, но я еще не понял этого.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Один из вариантов - просто обернуть код C ++, который создает семафор и запускает дочерний процесс, и вызывать его через P / Invoke (или использовать C ++ / CLI).

0 голосов
/ 30 марта 2010

Вы можете просто вызвать PInvoke для CreateSemaphore и ReleaseSemaphore, просто не забудьте использовать то же имя, что и четвертый параметр CreateSemaphore.

...