进程结束后,为什么还能获取它的退出码?

Super519 2008-01-01 02:31:26
在windows核心编程中有这样一段话:
一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下
来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝
马迹。希望这是很清楚的。

那为什么在进程结束以后还能通过调用G e t E x i t C o d e P r o c e s s来获得目前已经撤消的进程的退出代码
按照上面那段话不是退出以后,操作系统不是已经清除了所有的信息吗?
请帮忙释疑
...全文
434 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
evileagle 2008-01-03
  • 打赏
  • 举报
回复
或许上面说的有点问题,应该这么说,内核对象的句柄必须添加到进程的句柄表里才能用,否则即便知道了这个值直接用也会导致函数调用失败
evileagle 2008-01-03
  • 打赏
  • 举报
回复
直接用值是不行的,因为每个进程都要维护自己的句柄表,在不同的进程里同一个句柄值可不一定是指同一个东西
jameshooo 2008-01-03
  • 打赏
  • 举报
回复
句柄直接赋值只能在当前线程中使用,赋值后不会引起引用计数的改变。
把句柄解释成指针是有误解的,本质上句柄只是一个32位的数值,代表一个系统资源(所有系统资源都用句柄来表示),只不过在c语言中用void*来表示而已,或许内部也真的是一个指针,或许也是某个数组下标,这个值只有操作系统才能理解其含义。句柄是所有语言都能使用的,如果它是一个指针,某些无指针特性的语言就无法使用了。
Super519 2008-01-03
  • 打赏
  • 举报
回复
OK
谢谢楼上两位 问题清楚了
TO jameshooo:
句柄直接赋值只能在当前线程进行 "线程"是否应该改成进程?是不是一个进程有一个句柄表而所有的线程公用该句柄表?

To evileagle:
OK 句柄必须是在本进程句柄表中才是有效可用的,两个相同的值的句柄在不同的进程可以是不一样的 这个概念清楚了
Super519 2008-01-02
  • 打赏
  • 举报
回复
谢谢楼上两位的解释 也就是说复制句柄的时候会增加句柄的引用记数
是不是只有通过调用上述的复制句柄的函数才能复制句柄呢?而复制过程中引用记数的增加是那些函数的作用吧?
我指的复制并不是把一个进程句柄复制到另一个进程的句柄表里面,直接拿这个进程句柄来的值来用可以吗?就像"="号赋值,这样的方式是否可以实现呢?
也许这样问很傻,呵呵,请不要见怪
我对 句柄的理解 是操作系统表示对象的二次表示
也就是c语言里面的指向指针的指针,只是一个唯一的值被操作系统的句柄解释为好几个东西了而已
evileagle 2008-01-02
  • 打赏
  • 举报
回复
比如你要从进程b拷贝进程a的句柄(你自己的进程是c),说明b持有进程a的句柄,在b没有调用CloseHandle前进程a的句柄计数就不可能是0,c拷贝了这个句柄,c也占用了a句柄,所以要等c,b都CloseHandle句柄计数才会变成0(只假设只有b,c持有a的句柄),计数是否为0跟a是否退出没有任何关系,在a退出后,其他进程仍可以通过从b,c拷贝获取a的句柄(b,c还没有释放句柄),但是,当所有的进程都释放了a句柄(计数变为0),别的进程就无法获取这个句柄了,lz最好再仔细看看关于句柄计数的内容
jameshooo 2008-01-02
  • 打赏
  • 举报
回复
无论你是CreateProcess还是OpenProcess还是DuplicateHandle复制一个句柄,系统内部都会增加引用计数,必须依靠CloseHandle来减少引用计数,只要引用计数不是0,句柄就会一直存在。所以你根本不必担心进程退出后句柄是否消失,只要你拥有这个句柄,句柄就一定不会消失,因为你增加的引用计数必须要你自己来释放,别人释放不了。
Super519 2008-01-02
  • 打赏
  • 举报
回复
谢谢楼上回答 主要是刚看书,想从大概上先了解系统,具体的编程还不熟悉,不然就自己写个程序验证了
我的意思是你拷贝的时候的确可能这个进程的句柄还是有效的,但是你拷贝完成以后过了一段时间,句柄表示的进程已经退出,此时的它的引用记数应该为0了吧?此时不能再获取了吧?
evileagle 2008-01-02
  • 打赏
  • 举报
回复
如果你能从别的进程把句柄拷贝过来,说明该进程句柄的计数不为0,起码在你拷贝的原进程里还没有释放,如果那个进程句柄的计数已经为0,那你就无论如何获取不到他的句柄了,除非你自己捏造一个
chehw 2008-01-01
  • 打赏
  • 举报
回复
进程退出了并不代表该句柄的引用计数为0
Super519 2008-01-01
  • 打赏
  • 举报
回复
呵呵,谢谢赐教,我刚学习windows下编程
如果这个句柄是从别的地方拷贝过来的呢?获取该句柄的进程已经退出...
jameshooo 2008-01-01
  • 打赏
  • 举报
回复
只要有进程获取了目标进程句柄,它的引用计数就会加1,所以即使目标进程退出,它的进程句柄还会继续有效。你要理解引用计数的含义。
Super519 2008-01-01
  • 打赏
  • 举报
回复
这个句柄是之前获取的,然后这个进程退出了...
会不会是这样,函数退出返回err,getlasterr,错误码句柄无效?
jameshooo 2008-01-01
  • 打赏
  • 举报
回复
GetExitCodePorcess需要进程句柄作为参数,如果没有句柄怎么去调用?
Super519 2008-01-01
  • 打赏
  • 举报
回复
那么如果一个进程已经退出,而且它的句柄没有被别的进程引用,GetExitCodePorcess调用会怎么样?
这样应该对该进程是否运行过,发生了什么,不会再有一点信息了吧?
jameshooo 2008-01-01
  • 打赏
  • 举报
回复
因为进程句柄可能还在被别的进程使用(比如创建该进程的进程,或者OpenProcess的进程),虽然目标进程已经退出,但是句柄引用计数不为0,因此进程句柄的某些属性还保留在系统中,其中包括句柄的状态处于信号状态、进程的32位返回值继续有效。只有当句柄引用计数为0,所有这些跟句柄相关的属性才会被清理。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧