Linux共享内存

1.共享内存

  共享内存允许两个不相关的进程访问同一段物理内存。共享内存为多个进程之前共享和传递数据提供了一种有效的方式。但是它并没有提供同步机制,所以需要使用其他机制来同步访问。

2.操作函数

  int shmget(key_t key, size_t size, int shmflg);

    第一个参数,共享内存段的命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1。

    第二个参数,size指定需要共享的内存容量。

    第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。

    key通常使用ftok函数生成一个键值。ftok函数:key_t ftok(const char *pathname, int proj_id); ftok函数能够通过一个路径和子序号产生一个键值。两个不相关的进行,可以使用ftok函数得到相同的key来操作同一个共享内存。需要注意的是如果第一个进程使用ftok之后生成一个key,此时将pathname对应的文件删除后再重新建立,则后面进程生成的key值可能会改变导致不能访问之前建立的共享内存,这是因为文件的索引节点可能会改变。

    key也可以直接使用IPC_PRIVATE,由于该值表示key的值为0,所以不相关的进程就不能通过key得到共享内存,因此这种方式生成的IPC对象,和匿名管道(pipe)类似,只能用于相关的进程之间通信,最常用的就是父子进程。

    shmflg的值为IPC_CREAT表示:如果不存在key值的共享存储空间,则创建共享存储空间并返回一个共享存储标识符。如果存在,则直接返回共享存储标识符。

    shmflg的值为IPC_CREAT|IPC_EXCL表示:如果不存在key值的共享存储空间,则创建共享存储空间并返回一个共享存储标识符。如果存在,则返回-1。

扫描二维码关注公众号,回复: 5340894 查看本文章

    例如:int id = shmget(key,4096,IPC_CREAT|IPC_EXCL|0666);

       创建一个大小为4096个字节的权限为0666(所有用户可读可写)的共享存储空间,并返回一个整形共享存储标识符,如果key值已经存在有共享存储空间了,则出错返回-1。

  void *shmat(int shm_id, const void *shm_addr, int shmflg);

    第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。

    第一个参数,shm_id是由shmget函数返回的共享内存标识。

    第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。

    第三个参数,shm_flg是一组标志位,通常为0。

    该函数调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1。

  

猜你喜欢

转载自www.cnblogs.com/iamwho/p/10442818.html