C中的共享内存:Shmget问题

时间:2016-12-02 06:43:51

标签: c linux shared-memory

int shmid;
int* locat;

//create shared memory segment
shmid = shmget(6666, size, 0666);
if (shmid < 0) {
    perror("shmget");
    exit(1);
}

locat = (int *) shmat(shmid, NULL, 0);
if (locat == (int *) -1) {
    perror("shmat");
    exit(1);
}

我正在设置共享内存,但我一直收到此错误:shmget: No such file or directory

这段代码工作正常,不知道为什么会出现这种情况。

2 个答案:

答案 0 :(得分:1)

As the man says

  

IPC_CREAT

     

创建新细分。如果未使用此标记,则shmget()将找到与密钥关联的细分,并检查用户是否有权访问该细分。

您必须在IPC_CREAT来电

中添加shmget
shmid = shmget(6666, size, IPC_CREAT | 0666);

您还可以使用IPC_EXCL确保新创建细分

  

IPC_EXCL

     

此标志与IPC_CREAT一起使用以确保此调用                      创建细分。如果该段已存在,则                      呼叫失败。

答案 1 :(得分:0)

有两件事:

  1. 如果要初始化共享内存(对应于特定键值),则必须使用IPC_CREAT BITWISE OR权限号。
  2. 就像

    一样
    shmget(6666 , size , 0666|IPC_CREAT);
    
    1. 如果要将同一段(由键值标识)附加到另一个进程,则IPC_CREAT不是必需的,因为已经在逻辑地址空间中创建了共享内存。