• 3832阅读
  • 20回复

[提问]共享内存大小的问题 [复制链接]

上一主题 下一主题
离线foxgod
 

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


离线angelus

只看该作者 1楼 发表于: 2019-05-30
共享内存的出现是为了跨进程通讯的,如果你是在一个进程里,不需要共享内存。
直接用全局变量就行了,全局变量在多线程里依然可以访问

离线foxgod

只看该作者 2楼 发表于: 2019-05-30
回 angelus 的帖子
angelus:共享内存的出现是为了跨进程通讯的,如果你是在一个进程里,不需要共享内存。
直接用全局变量就行了,全局变量在多线程里依然可以访问
 (2019-05-30 11:25) 

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

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

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

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

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

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

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

只看该作者 6楼 发表于: 2019-07-19
共享内存没有跨平台性,不是首选,本地socket或者传统socket才是王道
离线fsu0413

只看该作者 7楼 发表于: 2019-07-21
回 angelus 的帖子
angelus:共享内存没有跨平台性,不是首选,本地socket或者传统socket才是王道
 (2019-07-19 09:28) 

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

只看该作者 8楼 发表于: 2019-07-22
回 fsu0413 的帖子
fsu0413:共享内存在posix标准和windows里都有。。。
除非你的平台是自创的 (2019-07-21 12:33) 

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

只看该作者 9楼 发表于: 2019-07-23
回 foxgod 的帖子
foxgod:共享内存,里面的数据存放是一直存在前一个数据的后面吗,还是需要自己去写地址存放,二共享内存存放的数据大于创造的时候,是自己的判断,还是需要自己判断呢 (2019-07-22 17:33) 

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

只看该作者 10楼 发表于: 2019-07-23
回 fsu0413 的帖子
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

只看该作者 11楼 发表于: 2019-07-23
回 fsu0413 的帖子
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

只看该作者 12楼 发表于: 2019-07-25
回 fsu0413 的帖子
fsu0413:共享内存在posix标准和windows里都有。。。
除非你的平台是自创的 (2019-07-21 12:33)

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

离线fsu0413

只看该作者 13楼 发表于: 2019-07-25
回 angelus 的帖子
angelus:举个简单的例子,安卓和ios下就无法用共享内存 , 当有跨设备的时候,共享内存更没啥用,万金油还是要靠socket
 (2019-07-25 11:18) 

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

只看该作者 14楼 发表于: 2019-07-25
回 foxgod 的帖子
foxgod:咨询个问题,就是共享内存读的时候为什么这样就读不出来了
char* readAdd = (char*)m_sharememory->constData();
QBuffer buffer;
buffer.setData(readAdd, ulSize);
....... (2019-07-23 17:20) 

不清楚。。。。
离线lf460

只看该作者 15楼 发表于: 2019-07-26
在Linux平台下,共享内存用setKey()设置了Key,在进程异常退出后,再次启动进程前,能否通过这个Key将原来的内存段清除呢?
离线foxgod

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

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

只看该作者 17楼 发表于: 2019-08-21
回 fsu0413 的帖子
fsu0413:1 在通信协议里定
2 detach了之后共享内存没了,数据也丢了 (2019-05-30 12:39) 

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

只看该作者 18楼 发表于: 2019-08-21
回 fsu0413 的帖子
fsu0413:不清楚。。。。 (2019-07-25 21:55) 

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

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

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

只看该作者 20楼 发表于: 2019-08-23
回 foxgod 的帖子
foxgod:调用detach后,共享内存会释放内存空间吗?? (2019-08-21 12:16) 

会  
快速回复
限100 字节
 
上一个 下一个