我想知道是否可以在共享内存(C,Linux)中创建链表。
假设我有一个创建共享内存并返回指向该内存的指针的库。例子:
// in lib header
typedef struct _SHM_STR_ {
int i;
char c;
} SHM_STR_t;
// in libomg.so
void lib_ret_shmem(SHM_STR_t** shm_pt)
{
int shm_fd;
SHM_STR_t *shm_map;
if ((shm_fd = shm_open(SHM_FILE, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE))) > 0) {
//first time created; init
...
} else if ((shm_fd = shm_open(SHM_FILE, (O_CREAT | O_RDWR), (S_IREAD | S_IWRITE))) < 0) {
return 1;
}
ftruncate(shm_fd, 20*sizeof(SHM_STR_t));
shm_map = (SHM_STR_t *)mmap(0, 20*sizeof(SHM_STR_t), (PROT_READ | PROT_WRITE), MAP_SHARED, shm_fd, 0)
...
// add new member
// linked list or work with the offset in the shared mem?
// increment pointer with offset and return in:
*shm_pt = shm_map;
}
// in proc1.c something like this
int main(int argc, char *argv[])
{
SHM_STR_t *ppp = NULL;
lib_ret_shmem(&ppp);
printf("%d %c\n", ppp->a, ppp->b);
return 0;
}
所以在库中,我为 20 个结构 SHM_STR_t 分配了足够的共享内存。
每次调用 lib_ret_shmem() 时添加新成员的最佳方法是什么?
我应该使用内存(或数组)基地址的偏移量吗?喜欢成员 [3] 我会返回类似的东西
*shm_pt = shm_map + 3;
或者可以在这个内存中创建链表?我感觉 *next 不会指向正确的记忆。
对不起,糟糕的解释:/