【发布时间】:2015-08-06 09:33:23
【问题描述】:
在 Linux 操作系统中,命名信号量是使用 sem_open API 在 /dev/shm/ 位置创建的。我正在使用 CreateSemaphore 在 Windows 中创建命名信号量。在 Windows 中创建的命名信号量在哪个位置?
【问题讨论】:
在 Linux 操作系统中,命名信号量是使用 sem_open API 在 /dev/shm/ 位置创建的。我正在使用 CreateSemaphore 在 Windows 中创建命名信号量。在 Windows 中创建的命名信号量在哪个位置?
【问题讨论】:
Windows named 信号量存在于内核的内部对象命名空间中。该数据库具有类似文件系统的分层树结构,但通过常规文件系统函数不可见。使用来自 Sysinternals(现为 Microsoft 的子公司)的 Object Viewer tool 来探索该空间。毫不奇怪,信号量具有对象类型 Semaphore。在其他对象中,互斥体被称为 Mutant(显然,在 David Cutler 将这些称为“突变信号量”,即私人通信之后)。 EventPair 对象通过 Win32 API 不可用。所有其他同步原语都可以在那里自我识别。
我认为用于从用户空间访问此数据空间的 API 没有完整的文档记录。 Windows DDK 标头确实很有趣。
未命名对象(使用NULL 作为对象名称传递的对象)供单个进程使用,并且只能由其子进程选择性地继承。这些没有在内核对象命名空间中注册。
与 POSIX 信号量不同,所有 Windows 对象在关闭这些对象的最后一个句柄时会自动删除(好像sem_open 始终称为sem_unlink),并且所有进程句柄在进程终止时由内核的执行程序关闭,是它是正常终止或中止。我要提到的是,如果您提出问题的动机是验证当所有使用信号量的进程都死亡时没有留下任何信号量。
【讨论】:
Windows 中没有信号量的文件系统或其他位置,您只能通过CreateSemaphore 访问它们。 Linux 具有提供对多个命名内核对象的访问的虚拟文件系统,但在 Windows 中并非如此,而且很少需要这样做。
【讨论】: