next up previous contents
下一主题: 系统调用:shmat() 上一层: 6.4.4 共享内存 前一主题: 内核 shmid_ds 结构

系统调用:shmget()

为了创建一个新的消息队列,或者访问一个已存在的队列,需要使用shmget()系统调用。


  SYSTEM CALL: shmget();                                                          

  PROTOTYPE: int shmget ( key_t key, int size, int shmflg );                                             
    RETURNS: shared memory segment identifier on success                                                       
             -1 on error: errno = EINVAL (Invalid segment size specified)
                                  EEXIST (Segment exists, cannot create)
                                  EIDRM (Segment is marked for deletion, or was removed)
                                  ENOENT (Segment does not exist)
                                  EACCES (Permission denied)
                                  ENOMEM (Not enough memory to create segment)
  NOTES:

这个特定的调用现在应该几乎像是旧闻了。它与相应的get消息队列和信号量集的调用非常相似。

的第一个参数shmget()是键值(在我们的例子中由调用ftok())返回)。然后将此键值与内核中其他共享内存段的现有键值进行比较。此时,打开或访问操作取决于shmflg参数的内容。

IPC_CREAT

如果内核中尚不存在该段,则创建该段。

IPC_EXCL

与 IPC_CREAT 一起使用时,如果该段已存在,则失败。

如果IPC_CREAT单独使用,shmget()要么返回新创建段的段标识符,要么返回具有相同键值的现有段的标识符。如果IPC_EXCLIPC_CREAT一起使用,那么要么创建一个新段,要么如果该段已存在,则调用失败并返回 -1。IPC_EXCL本身是无用的,但当与IPC_CREAT结合使用时,它可以作为一种机制来保证不会打开现有段进行访问。

再次,可选的八进制模式可以与掩码进行或运算。

让我们创建一个包装函数来定位或创建共享内存段


int open_segment( key_t keyval, int segsize )
{
        int     shmid;
        
        if((shmid = shmget( keyval, segsize, IPC_CREAT | 0660 )) == -1)
        {
                return(-1);
        }
        
        return(shmid);
}

请注意显式权限的使用0660。这个小函数要么返回共享内存段标识符(int),或者在错误时返回 -1。键值和请求的段大小(以字节为单位)作为参数传递。

一旦进程拥有给定段的有效 IPC 标识符,下一步是进程attach或将该段映射到其自身的地址空间中。


next up previous contents
下一主题: 系统调用:shmat() 上一层: 6.4.4 共享内存 前一主题: 内核 shmid_ds 结构

转换于
1996年3月29日星期五 14:43:04 EST