1

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

4

1 回答 1

1

您可能对共享内存段使用相同的密钥 - 如果您想要多个共享内存段,那么您需要使用不同的密钥。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);
}
于 2012-07-26T13:00:08.550 回答