【问题标题】:What's the differences between a Process ID and a Process handle进程 ID 和进程句柄有什么区别
【发布时间】:2010-11-08 02:25:03
【问题描述】:

进程 ID 是唯一标识进程的数字。进程句柄也是唯一标识进程内核对象的数字。

为什么我们都需要它们,因为它们中的任何一个都可以识别一个进程。

我认为答案可能在于进程与进程内核对象之间的映射关系。是否可以将多个进程内核对象映射到单个进程?每个进程内核对象都有自己的进程句柄。这样每个进程内核对象都可以代表不同的访问模式或类似的东西。

当我使用MiniDumpWriteDump() 函数时,我想到了这个问题,它是这样声明的:

BOOL WINAPI MiniDumpWriteDump(
  __in  HANDLE hProcess,
  __in  DWORD ProcessId,
  __in  HANDLE hFile,
  __in  MINIDUMP_TYPE DumpType,
  __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

所以它的参数包括进程ID和进程句柄。我只是不知道为什么必须同时拥有它们。

非常感谢您的见解。

【问题讨论】:

    标签: windows process


    【解决方案1】:

    进程句柄是

    1. 随意
    2. 获取它的进程内部。私有的,不能在线程/进程之间共享
    3. 它也带有安全访问权限

    虽然进程 ID 是

    1. 独特
    2. 通用、公共,因此可以在线程/进程之间共享

    【讨论】:

    • 请注意,您可以将句柄继承并复制到其他进程中,因此 2 并不完全正确。
    • 点头。如果在 CreateProcess API 中将 SECURITY_ATTRIBUTES.bInheritHandle 设置为 true,则子进程可以获得具有完全访问权限的父进程的句柄。 AFAIK,父进程不能共享它可能拥有的任何其他进程的句柄。如果我的理解有误,请纠正我。
    • Win32 HANDLE-s 可以在线程之间共享。唯一的例外是伪句柄,例如 GetCurrentThread 返回的。另外我要添加 HANDLE-s 需要关闭,因为它们实际上引用了系统资源。
    • Faheem:可以将任何句柄复制到另一个进程中。查看msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx
    • 进程 ID 并不是真正唯一的,因为一旦进程终止,它就可以(并且经常)被回收。
    【解决方案2】:

    不同之处在于“id”是唯一标识进程的系统范围编号。另一方面,'handle' 是一个不透明的值,它将进程 和对该进程的访问权 连接到您的程序。您可能对同一进程有多个不同的句柄。

    我不知道为什么 MiniDumpWriteDump 需要两者。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2012-11-16
      • 2010-09-17
      • 2012-12-06
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多