Linux共享内存及共享内存实现互斥循环队列shmFIFO

本文介绍了Linux进程间通讯的共享内存方法,对比了共享内存和管道的效率,并详细讲解了如何创建、连接、脱离共享内存以及如何使用信号量实现互斥循环队列shmFIFO,确保数据读写的正确性。
摘要由CSDN通过智能技术生成

Linux进程间通讯的方法有信号,消息队列,管道,共享内存。本篇介绍共享内存。

每一个进程都有自己的虚拟地址空间,每个进程的空间之间严格区分,互不干扰。但通过系统调用开辟一片内存,让不同进程都连接到此空间,就可以实现多进程共享一片空间。

进程本身认为,自己只操作了自己的空间,事实上操作的是一片与其它进程共用的空间。这样可以实现进程间的数据"传输",即进程间通讯。

共享内存是一种很快的进程间通讯方法。

拿共享内存和管道作比较:

  写数据 读数据
共享内存 直接写入内存 直接读取内存
管道 调用系统调用写入数据 调用系统调用读取数据

可以看到,共享内存在建立内存映射后,对数据的读写都不需要系统调用。而管道读写都需要系统调用。在Linux系统编程(一) 认识系统调用中介绍过,每一次系统调用,都要保护现场数据,转入核心空间操作,结束后恢复现场工作,转入用户空间。管道完成一次完整的读取需要转换四个操作空间,明显效率远低于共享内存。

使用方法

头文件:sys/types.h sys/ipc.h sys/shm.h

调用:shmget() shmctl() shmat() shmdt

1.

int shmget(key,size,shmflg)

key_t key ;

int size,shmflg;

第一个参数key是一个整数,可以理解为共享内存的名字,由程序员自己设定,或者可以通过ftok()产生(例如ftok("."'a')),第二个参数一个整数,表示开辟地址空间的大小,单位为字节。第三个参数用来建立共享内存并设定其权限。

用法一:创建共享内存 int id=shmget(key,size,IPC_CREAT|0644) 这里的size应为希望开辟的大小。id接受返回值,为一个识别码。

用法二:获取共享内存id  int id=shmget(key,0,0) 成功将返回名为key的共享内存的识别码。失败返回-1;

2

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值