リンクされたリストを共有メモリ (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 が正しいメモリを指していないように感じます。
ひどい説明でごめんなさい:/