1、QSharedMemory对象的创建:
(0)、 创建QSharedMemory实例对象,必须为该共享内存指定关键字,即一个名字,只有设置了关键字后,才可以执行创建create()、关联attach()等操作。
(1)、 通过构造函数QSharedMemory(const QString & key, QObject * parent = nullptr)
a、key为关键字,即为共享内存起一个名字。(我觉得此key是对应于Windows API中文件映射内核对象的名字)
b、举例:
QSharedMemory * sm = new QSharedMemory("QSharedMemoryExample");
(2)、 通过构造函数QSharedMemory(QObject * parent = nullptr)创建实例对象后,调用setKey()为该实例对象设置关键字。
a、举例:
QSharedMemory * sm = new QSharedMemory();
sm->setKey("QSharedMemoryExmple");
(3)、 QSharedMemory对象析构,会自动将进程与共享内存分离出来。
2、创建共享内存:
(0)、 bool create(int size, QSharedMemory::AccessMode mode = ReadWrite)
a、使用Key创建size大小的共享内存,并且将共享内存附加到进程上。
b、size指定共享内存的空间大小。
c、mode为访问共享内存的方式,默认是可读可写。QSharedMemory定义了两种访问方式:
-> QSharedMemory::ReadOnly 只读方式
-> QSharedMemory::ReadWrite 读写方式
d、成功返回true。失败返回false, 原因:Key标识的共享内存已经存在,此时不会执行附加操作, QSharedMemory::AlreadyExists; 没有足够的内存给开辟, QSharedMemory::OutOfResources。
(1)、 举例:
sm->create(100);
(2)、 (我觉得此步骤相当于Windows API中的CreateFileMapping)
3、关联共享内存:
(0)、 bool attach(QSharedMemory::AccessMode mode = ReadWrite)
a、尝试将进程附加到由Key标识的共享内存。
b、共享内存默认的访问方式为可读可写。
c、成功返回true。失败返回false,原因:没有找到Key标识的共享内存。
(1)、 举例:
sm->attach();
(2)、 (我觉得此步骤相当于Windows API中的MapViewOfFile)
4、分离共享内存:
(0)、 bool detach()
a、解除共享内存与进程的关联。
b、如果该共享内存被多个进程所关联,当最后一个进程和共享内存解除关联后,该共享内存将由操作系统自动释放掉。
c、分离成功返回true。分离失败返回false,原因: 该进程本身与共享内存就没有关联; 该共享内存被另一个进程锁定。
d、作为创建者,应该确定别人也不用共享内存了再解绑。
(1)、 举例:
sm->detach();
(2)、 (我觉得此步骤相当于Windows API中的UnmapOfView和CloseHandle)
5、判断共享内存的关联状态:
(0)、 bool isAttached() const
a、该函数用来判断进程是否和共享内存进行关联。
b、关联返回true。否则返回false。
(1)、 举例:bool b = sm->isAttached();
6、锁定共享内存:
(0)、 bool lock()
a、如果共享内存资源当前处于释放状态,进程调用该函数将共享内存中的资源锁定,并返回true。其它进程将不能访问该共享内存。
b、如果共享内存被其它进程占用时,则进程调用该函数会一直处于阻塞状态,直到其它进程使用完毕,释放共享内存资源。
(1)、 举例:
sm->lock();
7、解锁共享内存:
(0)、 bool unlock()
a、如果共享内存资源被当前进程所占有,调用该函数将解锁共享资源,并返回true。
b、如果当前进程没有占用该资源,或者共享内存被其它进程访问,则不做任何操作返回false。
(1)、 举例:
sm->unlock();
(2)、 为了保证共享内存中数据的完整性,当一个进程在读写共享内存的时候,其它进程不允许对该共享内存进行访问。
例如某一进程对共享内存进行读写操作之前,调用lock()锁定该共享内存,之后独享共享内存中的数据,访问共享内存完毕后,调用unlock()函数释放共享内存的使用权限。
8、获取共享内存的地址:
(0) 、
const void * constData() const;
void * data();
const void * data() const;
(1)、 进程关联共享内存的前提下,调用该函数返回共享内存中数据的起始地址。如果没有关联共享内存,则返回0。
9、获取共享内存的大小:
(0)、 int size() const
(1)、 调用该函数将返回进程所关联的共享内存的大小(字节)。如果没有关联的共享内存,则返回0。