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

时间:2012-07-26 12:52:11

标签: linux

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

1 个答案:

答案 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);
}