这个猜想我以信号量 Semaphore 为例
假设进程A创建了一个信号量,命名为 Test
那么进程B可以在之后用OpenSemaphore获得对这个内核对象的Handle
那么我请问,这个时候实际上对这个信号量的引用计数是多少?是1还是2?如果是2,那么我在A进程中使用CloseHandle关闭对这个semaphore的引用(或者直接退出进程)
那这个信号量会被摧毁吗?我认为是不会的,因为我觉得B还在引用它。
如果我以上的推论是正确的,那么就有这样一个问题:
我启动A进程,我创建一个信号量。
然后退出A进程。
我再启动A进程,我会不清楚这个信号量是否依然存在,如果在我上一步退出之前有其他任意的进程Open了这个内核对象,就会导致我现在无法创建。
是这样的吗?

解决方案 »

  1.   

    看你的需求,如果你希望无论如何都能打开,直接create,create的意思是没有就创建,有就打开。如果希望判断是不是别人创建的,就用open.
      

  2.   

    引用计数是2 不会导致无法创建,如果命名对象存在,Createxxx会转变为Openxxx操作,引用同一个对象,返回成功
      

  3.   

    内核对象是属于OS的不是进程的。如果是2,那么我在A进程中使用CloseHandle关闭对这个semaphore的引用(或者直接退出进程)
    那这个信号量会被摧毁吗?我认为是不会的,因为我觉得B还在引用它。
    --------------
    不会,只要引用计数不为0,这个内核对象就不会销毁
    我再启动A进程,我会不清楚这个信号量是否依然存在,如果在我上一步退出之前有其他任意的进程Open了这个内核对象,就会导致我现在无法创建。
    ------------------
    再次Create效果跟Open一样,返回一个已经存在的内核对象的句柄,这时候调用GertLastError会返回一个表示已存在的错误码(好像叫什么XXX_ALREADY_EXIST)具体资料参考windows核心编程