允许确定哪个 PID 正在使用它们的跨平台同步原语

Posted

技术标签:

【中文标题】允许确定哪个 PID 正在使用它们的跨平台同步原语【英文标题】:Cross-platform synchronization primitives which allow determining which PID is using them 【发布时间】:2019-06-20 08:32:59 【问题描述】:

我需要为进程同步原语设计一个包装器,它就像一个信号量,假设限制为 1(这样只有一个客户端可以同时锁定它)。如果这是唯一的要求,那么我可以使用命名信号量。但我也想知道,在客户端无法锁定原语的情况下,实际上是谁锁定了它。最好的办法是知道锁定进程 ID。我看到了如何在具有semctlGETPID 的 POSIX 系统上实现这一点,但 Windows 并没有公开类似的东西。我也知道我可以通过文件轻松实现这一点(例如,打开具有共享读取和非共享写入权限的已知文件 - 锁定客户端时创建该文件并写入它的 PID 以便其他人可以读取它),但如果可能的话我想使用实际的 OS API 原语而不是文件系统。这可能吗?

【问题讨论】:

这是 Windows 中严格禁止的知识,只有调试器才能访问信息。可能出于暴露此信息很危险的根本想法,用户倾向于做一些讨厌的事情,比如终止进程。值得注意的是 SysInternals 的 Handle 实用程序,它通过动态注入遍历未记录的句柄表的 ring 0 代码来工作。 您可以创建一个命名的共享内存块来存储所有者的pid。 【参考方案1】:

在 Windows 中,Wait Chain Traversal 可让您查看谁锁定了什么。

【讨论】:

谢谢,我试试看。

以上是关于允许确定哪个 PID 正在使用它们的跨平台同步原语的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核同步原语之原子操作

为啥我们需要 asyncio 同步原语,何时使用这些原语?

Linux同步原语之顺序锁(Sequence Lock)

进程控制

操作系统中的PV原语

boost::asio: “strand”类型的同步原语有啥名字吗?