是否无法从一个进程创建两个IPC共享内存段?
我正在尝试从单个进程创建两个共享内存,一个用于与单独进程共享数据,另一个用于与其子进程共享。我正在使用shmget,我也试图用ipcs获取系统中的共享内存信息。输出是这样的:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x0beefbaf 0 root 666 225544 4
0x00000000 98305 root 666 4 0
以上输出显示创建了两个共享段,但shmget仅返回0作为其输出。因此,一个共享内存段将连接两次。
shmget有什么问题,或者无法从一个进程创建两个共享内存。
答案 0 :(得分:0)
您可能对共享内存段使用相同的密钥 - 如果您需要多个共享内存段,则需要使用不同的密钥。有关获取密钥的标准方法,请参阅ftok
的手册页。
有一些系统级限制可以防止使用太多内存 - kernel.shmmax
和相关的sysctl属性。
这是一个非常简单的示例应用程序,完全可以解答问题:
#include <sys/shm.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc, char **argv) {
key_t key1;
key_t key2;
if (-1 != open("/tmp/foo", O_CREAT, 0777)) {
key1 = ftok("/tmp/foo", 0);
} else {
perror("open");
exit(1);
}
if (-1 != open("/tmp/foo2", O_CREAT, 0777)) {
key2 = ftok("/tmp/foo2", 0);
} else {
perror("open");
exit(1);
}
printf("%x %x\n", key1, key2);
int id1 = shmget(key1, 0x1000, IPC_CREAT | SHM_R | SHM_W);
int id2 = shmget(key2, 0x2000, IPC_CREAT | SHM_R | SHM_W);
printf("%x %x\n", id1, id2);
void *addr1 = shmat(id1, 0, 0);
if (addr1 == (void *)-1) perror("shmat1");
void *addr2 = shmat(id2, 0, 0);
if (addr2 == (void *)-1) perror("shmat2");
printf("%p %p\n", addr1, addr2);
shmctl(id1, IPC_RMID, NULL);
shmctl(id2, IPC_RMID, NULL);
}