【问题标题】:How do I create an inheritable Semaphore in .NET?如何在 .NET 中创建可继承的信号量?
【发布时间】:2010-03-28 20:47:50
【问题描述】:

我正在尝试创建一个可继承的 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 对象,但我还没有弄清楚。

【问题讨论】:

    标签: .net winapi process semaphore


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可以直接PInvoke到CreateSemaphore和ReleaseSemaphore,记住要和CreateSemaphore的第四个参数同名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多