gpt4 book ai didi

linux - 从一个进程创建多个共享内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:53 25 4
gpt4 key购买 nike

一个进程不能创建两个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 有什么问题,或者无法从一个进程创建两个共享内存。

最佳答案

您可能对共享内存段使用相同的 key - 如果您想要多个共享内存段,那么您需要使用不同的 key 。请参阅 ftok 的手册页获取 key 的标准方法。

存在系统级别限制,以防止使用过多内存 - 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);
}

关于linux - 从一个进程创建多个共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com