qnx中共享内存对象大小是不是必须固定

如果进程a有个长度不定的数据库想共享给进程b,怎么做比较合适?

还有2个问题
1,读进程是否无需ftruncate,因为这块空间是写进程创建的,长度只有写进程来把握,读进程只需预先知道空间长度即可。

2 如果写进程使用数组保存数据,可以放心用共享内存,如果使用链表保存数据,链表中元素不能保证地址是相邻的,那么这种储存方式是不是就不能用共享内存来实现IPC了?

先回答简单的,读进程一般只要做个ftell(),就能知道共享区长度,然后mmap了,不需要ftruncate.

可变数据区共享的问题,一般是由a准备最大数据区,然后告诉b,让b去map。这样,可能会浪费一点内存,但处理比较简单。

另一种我以前用过的比较复杂的方法,就是用多个定长共享数据区,比如每个是 1MB,这样a可以先建一个,通知B共享;数据增多时,a可以继续新建第二、第三个共享区,让b去map.

为了控制方便,a 和 b 之间还可以共享一个 "共享控制区“,专门用来存各共享数据区的信息,让b知道现在有哪些共享数据区。

指针的问题,指针是不能跨进程使用的,因为无法保证共享到同一地址。有投机的做法是想办法共享到同一空间(把数据块地址选在读写进程都有空档的地方)。不过,对于复杂的进程,或是你只是写一个库让别的进程调用的情形,这种方法不太可靠。

还有一个办法,就是在mmap时,a和b都指定要”物理上连续“(physical continue)的内存;这样,b只要知道a的块起始地址(就是mmap的返回值),就可以直接算出任何指针了。

ptrB = ptrA - baseaddrA + baseaddrB;

至于A的块起始地址(baseaddrA),a就可以存在“控制区"里让b来查询了。

这样B在用到共享空间里的指针时,

    1. 通过指针值 ptrA 查找”共享控制区“,找到指针属于哪个”共享块“;
  1. 根据”共享块“得到baseaddrA和baseaddrB (如果没有baseaddrB,说明这是个新块b需要mmap一下)
  2. 换算出指针在B上的值ptrB

有个疑问,mmap出来的内存缺省应该就是物理上连续的吧?抑或我之前理解不对?
另外,我又想了下怎么用共享内存进行链表或者二叉树这种数据库的同步,好像只能由写进程自己封装一个malloc函数,从线性空间取出地址使用,这样才能使得读进程获取到链表头后查找的每个元素都在共享对象的范围内。

mmap()出来的内存,在虚拟空间是连续的,在物理上不保证是连续的。如果要求物理上也是连续的,要用MMAP_PHYS | MMAP_ANON,你再看看MAP_PHYS的说明那一段。

对,所有数据都必须在共享内存里,两个进程才能共享。

另外,读写进程之间还必须保证同步,不然读进程走链表的时候写进程修改链表的话,读进程就会走飞掉。

我不知道详情,但为什么是两个进程在读写数据库呢。为什么不是一个进程来读写,别的进程来向它提请求呢?

简单说下需求,就是有个进程a不断地往一个链表里面添加删除元素,进程b对该链表进行查询操作,希望通过共享内存方式实现。
这里主要有2个问题。
1.就是前面提到的链表长度不定。你说的分段式申请共享内存是一种解决方法,但是实现感觉比较复杂。
2.由于使用链表来组织数据库,而共享内存相当于连续地址空间,因此我要自己写个void *my_alloc()与my_free(*p),这个有现成的库可用吗?