next up previous contents
下一个: 系统调用:shmctl() 向上: 6.4.4 共享内存 前一个: 系统调用:shmget()

系统调用:shmat()


  SYSTEM CALL: shmat();                                                          

  PROTOTYPE: int shmat ( int shmid, char *shmaddr, int shmflg);
    RETURNS: address at which segment was attached to the process, or
             -1 on error: errno = EINVAL (Invalid IPC ID value or attach address passed)
                                  ENOMEM (Not enough memory to attach segment)
                                  EACCES (Permission denied)
  NOTES:

如果 addr 参数为零 (0),则内核会尝试查找未映射的区域。 这是推荐的方法。 可以指定一个地址,但通常仅用于方便专有硬件或解决与其他应用程序的冲突。 可以将 SHM_RND 标志与 flag 参数进行 OR 运算,以强制传递的地址按页面对齐(向下舍入到最接近的页面大小)。

此外,如果将 SHM_RDONLY 标志与 flag 参数进行 OR 运算,则共享内存段将被映射进来,但标记为只读。

这个调用可能是最简单的用法。 考虑一下这个包装函数,它传递一个段的有效 IPC 标识符,并返回该段附加到的地址。


char *attach_segment( int shmid )
{
        return(shmat(shmid, 0, 0));
}

一旦段被正确附加,并且进程拥有指向该段起始位置的指针,那么读取和写入该段就变得像简单地引用或解引用该指针一样容易! 小心不要丢失原始指针的值! 如果发生这种情况,您将无法访问该段的基地址(起始地址)。



转换于
1996年3月29日 14:43:04 美国东部时间