我正在尝试创建一个可继承的Win32 Semaphore对象。这意味着我启动的任何子进程可能自动拥有对同一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 ++)。它在命令行上获取信号量ID,并在调用ReleaseSemaphore
时直接使用该值。)< / p>
我怀疑我需要构建一个特殊的SemaphoreSecurity
或ProcessStartInfo
对象,但我还没想到它。
答案 0 :(得分:1)
一种选择是只包装创建Semaphore的C ++代码并启动子进程,并通过P / Invoke(或使用C ++ / CLI)调用它。
答案 1 :(得分:0)
你可以只是PInvoke到CreateSemaphore和ReleaseSemaphore,只需记住使用与CreateSemaphore的第四个参数相同的名称。