系统中进程句柄的问题

转载 2007年09月23日 12:26:00
主  题:   请教系统中进程句柄的问题
作  者:   lailaiququ (看到你了)
等  级:  
信 誉 值:   100
所属论坛:   VC/MFC 进程/线程/DLL
问题点数:   50
回复次数:   4
发表时间:   2007-2-14 16:53:02
     
 
     

最近拜读侯杰的MFC深入浅出一书,基础篇中有些东西不太懂,下面繁体字是原话,这些在win2000系统中是否适用?系统加载用户程序后关闭进程句柄是什么目的?为了让用户程序完全独立,不受系统管理吗?关闭句柄究竟是个什么概念?CloseHandle函数会作些什么动作?

本來,母行程與子行程之間可以有某些關係存在,但shell 在呼叫CreateProcess 時已經把母子之間的臍帶關係剪斷了,因此它們事實㆖是獨立個體。稍後我會提到如何剪斷子行程的臍帶。

前面我曾說過所謂割斷臍帶這件事情,只要你把子行程以 CloseHandle 關閉,就達到了目的。㆘面是個例子:
PROCESS_INFORMATION ProcInfo;
BOOL fSuccess;
fSuccess = CreateProcess(...,&ProcInfo);
if (fSuccess) {
CloseHandle(ProcInfo.hThread);
CloseHandle(ProcInfo.hProcess);
}



 
  回复人:WingForce(初六,履霜,坚冰至。) ( 五级(中级)) 信誉:100 2007-2-14 17:27:57 得分:20
 
 
?

事实上进程或者线程的句柄标识的知识一个包含进程和线程统计信息的结构,这个结构和进程或线程本身是否运行没有关系

所以,如果你再也不需要查看进程和线程的这项统计信息,你就不在需要这个句柄了。
而且,windows系统对进程句柄会维护一个引用计数,当你不需要的时候,应该告诉系统,你不需要了。调用CloseHandle不会杀死句柄标识的对象,只会把那个引用计数减1。
Top
 
  回复人:lailaiququ(看到你了) ( 二级(初级)) 信誉:100 2007-2-14 17:37:25 得分:0
 
 
?

windows系统为何在运行用户程序时候要清掉这个计数值呢?
Top
 
  回复人:arronbnm() ( 二级(初级)) 信誉:100 2007-2-14 20:05:51 得分:10
 
 
?

计数器好像是内核资源的吧,使用多了,应该对系统运行有影响的吧
Top
 
  回复人:ATField(Yi Zhang - MSFT) ( 五级(中级)) 信誉:100 2007-2-15 13:27:11 得分:20
 
 
?

这些在任何Windows系统都适用。Windows对于每个内核对象(进程,线程,Event/Mutex/Semaphore, ....等等)都维护一个引用计数,这样当这个计数为0的时候Windows会自动将其释放,否则Windows认为仍然有进程在使用该内核对象,不会删除此对象。
以创建进程为例:A进程通过CreateProcess这个动作创建了一个进程B,进程B本身在运行,代表一个引用计数,而创建者A调用CreateProcess获得了一个句柄,也有一个引用计数。如果进程B结束,而调用者A不调用CloseHandle,那么在调用者A进程结束之前,进程B的资源不会释放。所以A需要调用CloseHandle把自己的引用计数-1,同时CloseHandle会让该句柄失效(从进程A的句柄表中移走),以后进程A不能再用了。然后在进程B结束的时候(这个动作也会导致计数-1),Windows会在计数-1的时候检查引用计数为0,然后释放进程B的资源。

顺便说一句,对象和对象的引用计数是整个系统级别的,而句柄则是进程级别的,每个进程都有一个句柄表。
 

关于进程句柄 窗口句柄的关系

如何查找到当前窗口所在进程的相关数据,如进程句柄、进程 首先通过类名 或 窗体的名字 得到映射窗口的窗口句柄  windows提供的API函数 FindWindow()函数就能完成这个任务 HWN...
  • sakawa_x
  • sakawa_x
  • 2013年12月05日 18:16
  • 1384

枚举系统进程句柄

#pragma once // Class 16 typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO { USHORT UniqueProcessId; ...
  • qq125096885
  • qq125096885
  • 2017年06月08日 10:22
  • 234

进程句柄和进程ID的区别和关系

进程句柄和进程ID的区别和关系  进程是一个正在运行的程序 进程里可以包括多个模块(DLL,OCX,等) 进程句柄是程序访问时用到的东西,当前进程句柄等于主模块的句柄,当你使用OpenP...
  • chenglinhust
  • chenglinhust
  • 2013年09月21日 00:19
  • 4655

有关遍历进程中句柄的方法总结

此篇文章说是原创有些牵强。就像题目所说的,更多的是对前人方法的总结。写作的初衷倒也不是技术方面的研究,不过是工作的需求罢了。 方法中涉及到一些函数需要提权,其实我一直以为网上那个标准的提权函数没什么...
  • swanabin
  • swanabin
  • 2013年11月30日 10:23
  • 2142

进程句柄

时隔2个月 发现下面有部分理论是错的 句柄表是有三层 在WRK中已有明确定义 EPROCESS下有一个ObjectType保存的这个进程的句柄表 ObjectType的值为_HANDER_...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016年04月04日 02:38
  • 439

关于获取进程句柄的问题

使用CreateProcess创建一个进程后,PROCESS_INFORMATION结构中会包含进程的handle,和唯一存在的进程ID 而后使用openprocess打开进程时,根据第一个参数 (d...
  • lovelyloulou
  • lovelyloulou
  • 2010年01月25日 01:05
  • 5778

如何得到一个进程的句柄

1.       获取进程句柄。通过窗口可以获得GetWindowThreadProcessID通过窗口句柄来获得进程的ID,然后通过进程的ID调用OpenProcess函数来获取进程句柄。OpenP...
  • huiguixian
  • huiguixian
  • 2010年06月15日 15:41
  • 1513

进程句柄方面的问题

为何用GetCurrentProcess()得到的句柄总是0FFFFH?用GetParent()总是得到NULL?还有,请问怎么改变当前窗口的标题?...
  • earthbig
  • earthbig
  • 2004年11月06日 00:29
  • 604

Linux下查看进程占用句柄

使用root账号获取进程ID
  • Genius_LG
  • Genius_LG
  • 2014年09月11日 15:17
  • 2453

进程句柄HANDLE获得进程主窗口的句柄HWND

一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口是否属于这个进程。  typede...
  • yuepeng_csdn
  • yuepeng_csdn
  • 2016年07月31日 15:34
  • 2383
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:系统中进程句柄的问题
举报原因:
原因补充:

(最多只允许输入30个字)