系统中进程句柄的问题

主  题:   请教系统中进程句柄的问题
作  者:   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 mfc shell
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭