查看完整版本: [-- 共享内存大小的问题 --]

QTCN开发网 -> Qt基础编程 -> 共享内存大小的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

foxgod 2019-05-29 18:00

共享内存大小的问题

问题1:sharememory->create( Size ) 不管这个size为大小,qDebug()<<sharememory->size() ,为什么总是4096呢???
问题2:如果多个线程访问共享内存,是不是只能有一个进程调用sharememory->create( Size )这个函数呢?子进程就不需要?
问题3:主进程这样创建,
  1. if (sharememory->isAttached())//检测程序当前是否关联共享内存,避免上次未正确关闭时,共享内存未关闭。
        {
            sharememory->detach();// 将该进程与共享内存段分离
        }
        if (!sharememory->create( SizeCount ) )
        {
            qDebug()<< "InitMainSharedMemory::Unable to create shared memory segment.";
            return sharememory->error();
        }
那么子进程是否还需要
  1. if (sharememory->isAttached())//检测程序当前是否关联共享内存,避免上次未正确关闭时,共享内存未关闭。
    {
    sharememory->detach();// 将该进程与共享内存段分离
    }
问题4:是否可以在主进程里面设置多个共享内存。调用detach()后,是不是这个共享内存就释放了,在使用的时候需要再次create大小呢???这个内存的地址被释放了,还是内存里面的内容被释放了?



angelus 2019-05-30 11:25
共享内存的出现是为了跨进程通讯的,如果你是在一个进程里,不需要共享内存。
直接用全局变量就行了,全局变量在多线程里依然可以访问


foxgod 2019-05-30 11:35
angelus:共享内存的出现是为了跨进程通讯的,如果你是在一个进程里,不需要共享内存。
直接用全局变量就行了,全局变量在多线程里依然可以访问
 (2019-05-30 11:25) 

我这个是两个进程间获取数据,所以需要共享内存,就是我设置的大小最后比实际的大,有点奇怪

fsu0413 2019-05-30 12:27
1 Qt有说明,返回的size可能大于设置的size,里面需要存一些Qt自己的东西
2 只有一个进程调用create,其他进程调用attach
3 主进程子进程都不用检测,如果共享内存没有正确关闭的话:
  Windows下:无需任何处理,共享内存会被系统关闭
  Linux下:无法进行任何处理,共享内存一定会崩溃
4 只有最后一个实例调用detach或者析构后才会释放

foxgod 2019-05-30 12:34
fsu0413:1 Qt有说明,返回的size可能大于设置的size,里面需要存一些Qt自己的东西
2 只有一个进程调用create,其他进程调用attach
3 主进程子进程都不用检测,如果共享内存没有正确关闭的话:
  Windows下:无需任何处理,共享内存会被系统关闭
  Linux下:无法进行任 .. (2019-05-30 12:27) 

如果这个size比我创建的大,我往里面存的数据,在取出来的时候,不是比我存的字节多,就出错了,这个子进程不知道该取多大的字节,就去了共享内存那么大的字节,所以不是存入的数据那么大的,怎么弄呢?

只有最后一个实例调用detach或者析构后才会释放,你说的这个是并发的时候吧,那如果我两个进程一前以后,中间相隔了10s,那么我第一个实例detach后,第二个实例是否还可以正确取里面的数据呢?

fsu0413 2019-05-30 12:39
foxgod:如果这个size比我创建的大,我往里面存的数据,在取出来的时候,不是比我存的字节多,就出错了,这个子进程不知道该取多大的字节,就去了共享内存那么大的字节,所以不是存入的数据那么大的,怎么弄呢?
只有最后一个实例调用detach或者析构后才会释放,你说的这个是并发的时候 .. (2019-05-30 12:34) 

1 在通信协议里定
2 detach了之后共享内存没了,数据也丢了

angelus 2019-07-19 09:28
共享内存没有跨平台性,不是首选,本地socket或者传统socket才是王道

fsu0413 2019-07-21 12:33
angelus:共享内存没有跨平台性,不是首选,本地socket或者传统socket才是王道
 (2019-07-19 09:28) 

共享内存在posix标准和windows里都有。。。
除非你的平台是自创的

foxgod 2019-07-22 17:33
fsu0413:共享内存在posix标准和windows里都有。。。
除非你的平台是自创的 (2019-07-21 12:33) 

共享内存,里面的数据存放是一直存在前一个数据的后面吗,还是需要自己去写地址存放,二共享内存存放的数据大于创造的时候,是自己的判断,还是需要自己判断呢

fsu0413 2019-07-23 07:35
foxgod:共享内存,里面的数据存放是一直存在前一个数据的后面吗,还是需要自己去写地址存放,二共享内存存放的数据大于创造的时候,是自己的判断,还是需要自己判断呢 (2019-07-22 17:33) 

1 共享内存是有名字的。。。一般用名字来引用地址空间
2 没理解

foxgod 2019-07-23 08:56
fsu0413:1 共享内存是有名字的。。。一般用名字来引用地址空间
2 没理解 (2019-07-23 07:35) 

就是共享内存我存数据的时候,
char *to = static_cast<char*>(sharedMemory->data());
const char *from = buffer.data().constData();
memcpy(to,from,qMin(size,sharedMemory->size()));
我需要自己先获取先前存的数据的大小,然后指针加上这个偏移量,还是自动的加到先前的数据的后面去了

foxgod 2019-07-23 17:20
fsu0413:共享内存在posix标准和windows里都有。。。
除非你的平台是自创的 (2019-07-21 12:33) 

咨询个问题,就是共享内存读的时候为什么这样就读不出来了
char* readAdd = (char*)m_sharememory->constData();
QBuffer buffer;
buffer.setData(readAdd, ulSize);
buffer.open(QBuffer::ReadOnly);



但是这样就可以读出来

QBuffer buffer;
buffer.setData((char*)m_listsharememory.at(i)->constData(), ulSize);
buffer.open(QBuffer::ReadOnly);

是什么原因呢

angelus 2019-07-25 11:18
fsu0413:共享内存在posix标准和windows里都有。。。
除非你的平台是自创的 (2019-07-21 12:33)

举个简单的例子,安卓和ios下就无法用共享内存 , 当有跨设备的时候,共享内存更没啥用,万金油还是要靠socket


fsu0413 2019-07-25 21:55
angelus:举个简单的例子,安卓和ios下就无法用共享内存 , 当有跨设备的时候,共享内存更没啥用,万金油还是要靠socket
 (2019-07-25 11:18) 

共享内存其实就是进程间通信用的,移动端可以看作单进程。。。。。
共享内存本来就不是给跨设备用的

fsu0413 2019-07-25 21:55
foxgod:咨询个问题,就是共享内存读的时候为什么这样就读不出来了
char* readAdd = (char*)m_sharememory->constData();
QBuffer buffer;
buffer.setData(readAdd, ulSize);
....... (2019-07-23 17:20) 

不清楚。。。。

lf460 2019-07-26 16:48
在Linux平台下,共享内存用setKey()设置了Key,在进程异常退出后,再次启动进程前,能否通过这个Key将原来的内存段清除呢?

foxgod 2019-07-31 08:47
lf460:在Linux平台下,共享内存用setKey()设置了Key,在进程异常退出后,再次启动进程前,能否通过这个Key将原来的内存段清除呢? (2019-07-26 16:48) 

下次启动的时候,调用detach清除内存

foxgod 2019-08-21 09:44
fsu0413:1 在通信协议里定
2 detach了之后共享内存没了,数据也丢了 (2019-05-30 12:39) 

用什么办法可以获取已经往共享内存里面写入了多少的数据呢,写入的是个结构体。
我用
char*  memoryAdd          = (char*)const_cast<void*>(sharememory->data());//获取共享内存中的地址
strlen(memoryAdd);
这样就截断了,大小就不对了

foxgod 2019-08-21 12:16
fsu0413:不清楚。。。。 (2019-07-25 21:55) 

调用detach后,共享内存会释放内存空间吗??

fsu0413 2019-08-23 08:22
foxgod:用什么办法可以获取已经往共享内存里面写入了多少的数据呢,写入的是个结构体。
我用
char*  memoryAdd          = (char*)const_cast<void*>(sharememory->data());//获取共享内存中的地址
strlen(memory .. (2019-08-21 09:44) 

共享内存没这功能,需要你自己定义协议
我不知道你为什么钟情于往共享内存里写raw结构体,strlen不可能是对的

fsu0413 2019-08-23 08:22
foxgod:调用detach后,共享内存会释放内存空间吗?? (2019-08-21 12:16) 

会  


查看完整版本: [-- 共享内存大小的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled