系统中进程句柄的问题

转载 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的资源。

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

相关文章推荐

搜索Linux系统所有进程打开(文件)句柄的命令

1.搜索进程打开的句柄列表

多进程情况下文件句柄共享的问题

1 Linux中的父子进程fork() 和 clone()系统调用可用来建立新的进程。这两个系统调用结束时,内核在系统的物理内存中为新的进程分配新的 task_struct 结构,同时为新进程要使用的...

关于获取进程句柄的问题

使用CreateProcess创建一个进程后,PROCESS_INFORMATION结构中会包含进程的handle,和唯一存在的进程ID   而后使用openprocess打开进程时,根据...
  • HMSIWTV
  • HMSIWTV
  • 2012年08月20日 16:52
  • 1532

聊聊进程异常重启的问题------顺便详解linux句柄泄漏问题的定位(知识点: lsof -p xxx; ll /proc/xxx/fd)

之前做过嵌入式开发, linux环境玩代码, 这玩意儿最终是卖给用户。 产品一旦到用户手上, 要修复bug的代价就很大了, 而且, 由于是用户(个体)触发, 所以很多问题是不太好暴露出来的。 比如某些...
  • stpeace
  • stpeace
  • 2016年07月02日 09:53
  • 2146

Linux系统的文件句柄数量问题

获取句柄和进程

  • 2013年12月05日 14:01
  • 6KB
  • 下载

C#获取进程的主窗口句柄

通过调用Win32 API实现。 public class User32API {     private static Hashtable processWnd = null;     ...

HandleLook进程句柄查看

  • 2014年03月01日 23:31
  • 160KB
  • 下载

关闭进程打开的句柄

  • 2008年07月27日 14:16
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:系统中进程句柄的问题
举报原因:
原因补充:

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