【发布时间】:2018-04-20 21:13:45
【问题描述】:
我正在使用共享内存,我的程序需要几个指针,但我有一个限制,只能使用一个标识符:
int idSh;
int * mem;
char * mem2;
idSh = Shmget (IPC_PRIVATE, sizeof (char *) + sizeof (int *), IPC_CREAT | 0700);
mem = Shmat (idSh,0,0);
mem2 = Shmat (idSh,0,0);
我必须在 Shmat 中使用多个指针,但我只有一段共享内存,标识符为 idSh。
有什么解决办法吗?
【问题讨论】:
-
您是否尝试在进程之间共享指针?我认为这不会有用,您不能保证地址值在另一个进程中有效。见stackoverflow.com/questions/10776762/…
-
是的,我正在尝试在进程之间共享指针,标识符是全局的。
-
全局标识符对于进程来说仍然是唯一的,指向它们的指针对于进程也是唯一的。您不应将指针存储在共享区域中。如果它看起来有效,那么这是一个不能保证的巧合。
-
如果你想共享数组,那么你应该在共享段内为这些数组分配内存并将内容复制到它们——你显然需要使用信号量之类的东西来同步它。
-
来自
shmat的 Linux 手册页:使用 shmat() 和 shmaddr 等于 NULL 是附加共享内存段的首选、可移植方式。请注意,以这种方式附加的共享内存段可能会附加到不同进程中的不同地址。因此,在共享内存中维护的任何指针都必须是相对的(通常是相对于段的起始地址),而不是绝对的。
标签: c unix shared-memory