首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于内查对象的一些猜想,请帮忙验证

2013-06-25 
关于内核对象的一些猜想,请帮忙验证这个猜想我以信号量 Semaphore 为例假设进程A创建了一个信号量,命名为

关于内核对象的一些猜想,请帮忙验证
这个猜想我以信号量 Semaphore 为例
假设进程A创建了一个信号量,命名为 Test
那么进程B可以在之后用OpenSemaphore获得对这个内核对象的Handle


那么我请问,这个时候实际上对这个信号量的引用计数是多少?是1还是2?

如果是2,那么我在A进程中使用CloseHandle关闭对这个semaphore的引用(或者直接退出进程)
那这个信号量会被摧毁吗?我认为是不会的,因为我觉得B还在引用它。


如果我以上的推论是正确的,那么就有这样一个问题:
我启动A进程,我创建一个信号量。
然后退出A进程。
我再启动A进程,我会不清楚这个信号量是否依然存在,如果在我上一步退出之前有其他任意的进程Open了这个内核对象,就会导致我现在无法创建。


是这样的吗?
[解决办法]
看你的需求,如果你希望无论如何都能打开,直接create,create的意思是没有就创建,有就打开。如果希望判断是不是别人创建的,就用open.
[解决办法]
引用计数是2 

不会导致无法创建,如果命名对象存在,Createxxx会转变为Openxxx操作,引用同一个对象,返回成功
[解决办法]
推论是正确的

会正常创建,并且会返回成功原因是以存在。
[解决办法]
内核对象是属于OS的不是进程的。

如果是2,那么我在A进程中使用CloseHandle关闭对这个semaphore的引用(或者直接退出进程)
那这个信号量会被摧毁吗?我认为是不会的,因为我觉得B还在引用它。
--------------
不会,只要引用计数不为0,这个内核对象就不会销毁


我再启动A进程,我会不清楚这个信号量是否依然存在,如果在我上一步退出之前有其他任意的进程Open了这个内核对象,就会导致我现在无法创建。
------------------
再次Create效果跟Open一样,返回一个已经存在的内核对象的句柄,这时候调用GertLastError会返回一个表示已存在的错误码(好像叫什么XXX_ALREADY_EXIST)

具体资料参考windows核心编程

热点排行