3

我正在尝试创建一个可继承的 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。)


我怀疑我需要构造一个特殊的SemaphoreSecurityProcessStartInfo对象,但我还没有弄清楚。

4

2 回答 2

1

一种选择是只包装创建信号量并启动子进程的 C++ 代码,并通过 P/Invoke(或使用 C++/CLI)调用它。

于 2010-03-28T20:49:35.297 回答
0

您可以只 PInvoke 到 CreateSemaphore 和 ReleaseSemaphore,只需记住使用与 CreateSemaphore 的第四个参数相同的名称。

于 2010-03-30T03:58:09.977 回答