关于linux共享内存中的一个重要函数shmget

来源:互联网 发布:超级优化txt百度云 编辑:程序博客网 时间:2024/06/01 09:54

函数shmget()

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key,size_size,int shmflg);  //这个是函数shmget的原型。

       首先解释一下值与你所写的一样,可以取得共享内存标识符;2.若没有发现这个key值,则创建一个共享内存并返回共享内存标识符。

       key_t key

       key标识符共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget(IPC_PRIVATE)将创建一块新的共享内存;如果key值取0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存。

    现在解释一下什么是键值,在IPC的通信模式下,不管是使用消息队列还是共享内存,甚至是信号量,每个IPC的对象(object)都有唯一的名字,称为“键”(key)。通过“key”,进程能够识别所用的对象。“键”与IPC对象的关系就如同文件名称之于文件,通过文件名,进程能够读写文件内的数据,甚至多个进程能够共用一个文件。而在IPC的通讯模式下,通过"键“的使用也使得一个IPC对象能为多个进程所共用。
   Linux系统中的所有表示System V中IPC对象的数据结构都包括一个ipc_perm结构,其中包含有IPC对象的键值,该键用于查找System V中IPC对象的引用标识符。如果不使用“键”,进程将无法存取IPC对象,因为IPC对象并不存在于进程本身使用的内存中。   通常,都希望自己的程序能和其他的程序预先约定一个唯一的键值,但实际上并不是总可能的成行的,因为自己的程序无法为一块共享内存选择一个键值。因此,在 此把
key设为IPC_PRIVATE,这样,操作系统将忽略键,建立一个新的共享内存,指定一个键值,然后返回这块共享内存IPC标识符ID。而将这个 新的共享内存的标识符ID告诉其他进程可以在建立共享内存后通过派生子进程,或写入文件或管道来实现。
      int size(单位字节Byte)
      size是要建立共享内存的长度。所有的内存分配操作都是以页为单位的(这个我以前从没听说过)。所以一段进程只申请一块只有一个字节的内存,内存也会分配整整一页。这样的话,新创建的共享内存的大小实际上是从size这个参数调整而来的页面大小。例如size为1至4096,则实际申请到的共享内存大小为4k(一页),在i386机器中一页的缺省大小PACE_SIZE=4096字节,并依此类推。
      int shmflg
      shmflg主要和一些标志有关。其中包括IPC_CREAT和IPC_EXCL。
      IPC_CREAT  如果共享内存不存在,则创建一个共享内存,如果共享内存存在,则执行打开操作。
      IPC_EXCL     只有共享内存不存在的时候,新的共享内存才建立,否则就产生错误。
      两种情况:
     1.单独使用IPC_CREAT,shmget()函数要么返回一个已经存在的共享内存的操作符,要么返回一个新建的共享内存标识符。
     2.如果IPC_CREAT和IPC_EXCL标志一起使用,shmget()将返回一个新建的共享内存的标识符;如果该共享内存已存在,返回-1。为什么要两个标志一起使用呢?因为它们两个标志一起使用可以用来保证所得的对象c是新建的,而不是打开已有的对象。对于用户的读 取和写入对于用户的读 取和写入许可指定SHM_R和SHM_W,(SHM_R>3)和(SHM_W>3)是一组读取和写入许可,而(SHM_R>6)和(SHM_W>6)是全局读取和写入许可.
      返回值
      成功返回共享内存的标识符;不成功返回-1,errno存储错误原因。