Мне интересно, можно ли создать связанный список в общей памяти (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 не будет указывать на правильную память.
Извините за ужасное объяснение :/