关于内核对象的一些猜想,请帮忙验证
这个猜想我以信号量 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核心编程