关闭

跨进程共享内核对象方法:命名对象

658人阅读 评论(0) 收藏 举报
分类:

下面的所有函数都可以创建命名的内核对象:
CreateMutex,CreateEvent,CreateFileMapping,
CreateSemaphore,CreateWaitableTimer,CreateJobObject。
他们都包含了一个 PSLCURITY_ATTRIBUTES psa 参数表示安全描述符,用以描述内核对象的安全性。它描述了内核对象的拥有者。大部分情况下都是传入NULL,表示使用默认的安全性。

一:所有这些对象都共享单个名空间,所以创建相同名字的对象会返回对象已存在的错误。

HANDLE hMutex = CreateMutex(NULL. FALSE, "Global\\Stop_Event");
HANDLE hSem = CreateSemaphore(NULL, 1, 1, "Global\\Stop_Event");
DWORD dwErrorCode = GetLastError(); //返回ERROR_ALREADY_EXISTS

二:调用上面Create*系列函数与调用Open*系列函数之间的主要差别
如果对象并不存在,那么Create*函数将创建该对象,而Open*函数则返回失败。

三:使用命名对象来共享对象

    //创建共享对象
    SECURITY_DESCRIPTOR sd = {0};
    SECURITY_ATTRIBUTES sa = {0};
    ::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    ::SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE);
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = &sd;
    sa.bInheritHandle = TRUE;
    HANDLE m_hMutex_Stop = ::CreateEvent (&sa, TRUE, FALSE, _T("Global\\Stop_Event"));
    if (m_hMutex_Stop != NULL)
    {
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            ::CloseHandle(m_hMutex_Stop);
            return;
        }
    }

    //打开共享对象
    HANDLE hEvt = ::OpenEvent (EVENT_ALL_ACCESS , TRUE, _T("Global\\Stop_Event"));

四:其他
1:复制对象句柄 Duplicatehandle
2:对同一个命名对象CreateEvent的调用取得成功时,对命名对象的使用计数就会递增。它并不一定实际创建一个命名对象,只是被赋予一个与进程相关的句柄值,用于标识内核中现有的命名对象。
3:创建命名对象后返回的这个句柄并不一定跟其他进程返回的句柄相同,原因是句柄仅仅是独立于每个进程的句柄表的一个索引,它引用的是自己打开的的内核对象。

参考:
跨越进程边界共享内核对象【命名对象】
http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813733.html
谈谈内核对象及句柄的本质
http://blog.csdn.net/ithzhang/article/details/7927682

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java线程对单个对象的共享的一些方式

最近看了关于java多线程的一些知识,今天总结一下。主要总结的是java多线程对于单个对象共享的控制,主要从可见性、发布逸出、线程封闭、不变性、安全发布5个方面来进行总结,看的书籍为《Java并发边编...
  • u013159433
  • u013159433
  • 2015-12-18 18:06
  • 2285

Linux进程通信之POSIX共享内存

前面已经讨论过Linux下个各种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。...
  • anonymalias
  • anonymalias
  • 2013-08-13 01:09
  • 6405

java中共享内存的实现

JDK1.4里面的MappedByteBuffer为开发人员在java中实现共享内存提供了良好的方法,该 缓冲区实际上是一个磁盘文件的内存映像,二者的变化会保持同步,即内存数据发生变化过后会...
  • gaoxueyi551
  • gaoxueyi551
  • 2014-06-21 21:38
  • 9125

Windows进程共享内核对象的3种方法

转载的:http://www.51testing.com/html/51/n-821751.html Windows内核对象是什么我这里就不介绍了,任何一本关于windows编程的书都会介绍,...
  • darkbus111
  • darkbus111
  • 2015-11-18 14:39
  • 427

Chapter03-跨进程共享内核对象

一、windows内核对象的基本概念 1.所谓内核对象,实质就是由系统内核在内存中分配的一个内存块,这个内存块只能由内核分配,也只能由内核访问。常见的内核对象如:文件对象,时间对象,文件映射对象,互斥...
  • tzs33
  • tzs33
  • 2015-01-17 10:08
  • 181

进程共享内核对象之 复制内核对象句柄

进程共享内核对象的三种方式: 1.     内核对象句柄继承 2.     为内核对象命名 3.     复制内核对象句柄 今天写一下第三种方...
  • Hilavergil
  • Hilavergil
  • 2017-11-04 17:35
  • 45

跨进程边界共享内核对象

1、利用文件映射对象,可以在同一台机器上运行的两个不同进程之间共享数据块 2、借助邮件槽和命名管道,在网络中的不同计算机上运行的进程可以相互发送数据块 3、互斥量、信号量和事件允许不同进程中的线程同步...
  • pan_nainai
  • pan_nainai
  • 2016-09-07 09:23
  • 119

-跨越进程边界共享内核对象【命名对象】

跨越进程边界共享内核对象有三种方法: 对象句柄的继承性命名对象复制对象句柄 命名对象 共享跨越进程边界的内核对象的第二种方法是给对象命名,注意有些内核对象是不可以命名的,但多数内核对象可以命...
  • javaweb_research
  • javaweb_research
  • 2011-08-26 13:39
  • 242

3.3 跨越进程边界共享内核对象

3.3 跨越进程边界共享内核对象 许多情况下,在不同进程中运行的线程需要共享内核对象。下面是为何需要共享的原因: • 文件映射对象使你能够在同一台机器上运行的两个进程之间共享数据块。 • 邮箱和指定...
  • chenzhisi
  • chenzhisi
  • 2014-03-31 15:37
  • 620

windows笔记-跨越进程边界共享内核对象【对象句柄的继承性】

原文地址:http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813698.html 都是一些概念性的东西,看得可能会有点烦,不过看了...
  • eagleatustb
  • eagleatustb
  • 2013-04-29 12:21
  • 686
    个人资料
    • 访问:57826次
    • 积分:975
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:19篇
    • 译文:0篇
    • 评论:2条