进程间的通信-----共享内存,消息队列

1.共享内存的特点

1.共享内存是进程间最为有效的通信方式,直接读取内存,不需要数据的拷贝

2.内核专门留出一段内存,供访问的进程将虚拟内存映射到物理内存,进程可以直接访问,不需要数据的拷贝,这一段是由内存管理单元(MMU)完成虚拟内存映射物理内存

3.共享内存不提供同步机制,也就是说在第一个进程结束访问前,第二个进程也可以访问,所以需要信号量互斥锁来同步.

用户级页表是用户层的数据结构,是由操作系统为进程创建,记录虚拟内存和物理内存的映射关系,MMU是硬件,通过查找用户级页表来实现虚拟内存转换为物理内存.

2.步骤

1.创建key值

key_t ftok(const char *pathname, int proj_id);
功能:创建出来的具有唯一映射关系的一个key值,帮助操作系统用来标识一块共享内存
参数:
    Pathname:已经存在的可访问文件的名字
    Proj_id:一个字符(因为只用低8位)
返回值:成功:key值
      失败:-1

2.创建或者打开共享内存

int shmget(key_t key, size_t size, int shmflg);
功能:创建或打开共享内存
参数:
    key  键值
    size   共享内存的大小
    shmflg   IPC_CREAT|IPC_EXCL|0777
返回值:成功  shmid
      出错    -1

3.映射共享内存到用户空间

void  *shmat(int  shmid,const  void  *shmaddr,int  shmflg); //attaches
功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
参数:
    shmid   共享内存的id号
    shmaddr   一般为NULL,表示由系统自动完成映射
              如果不为NULL,那么有用户指定
    shmflg:SHM_RDONLY就是对该共享内存只进行读操作
                0     可读可写
返回值:成功:完成映射后的地址,
       出错:-1(地址)

4.取消映射

int shmdt(const void *shmaddr); //detaches
功能:取消映射
参数:要取消的地址
返回值:成功0  
      失败的-1
      

5.删除共享内存

int  shmctl(int  shmid,int  cmd,struct shmid_ds *buf); //control
功能:(删除共享内存),对共享内存进行各种操作
参数:
    shmid   共享内存的id号
    cmd     IPC_STAT 获得shmid属性信息,存放在第三参数
            IPC_SET 设置shmid属性信息,要设置的属性放在第三参数
            IPC_RMID:删除共享内存,此时第三个参数为NULL即可
    buf    shmid所指向的共享内存的地址,空间被释放以后地址就赋值为null
返回:成功0 
     失败-1

3.shell命令

ipcs -m: 查看系统中的共享内存

ipcrm -m shmid:删除共享内存

ps: 可能不能直接删除掉还存在进程使用的共享内存。

这时候可以用ps -ef对进程进行查看,kill掉多余的进程后,再使用ipcs查看。

4.消息队列的特点

消息队列是IPC对象(活动在内核级别的一种进程间通信的工具)的一种

一个消息队列由一个标识符 (即队列ID)来标识

消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等

消息队列可以按照类型(自己设一个值作为类型)来发送/接收消息

5.步骤

  1. 创建key值: ftok()
  2. 创建或打开消息队列: msgget()
  3. 添加消息:按照消息的类型把消息添加到打开的消息队列末尾 msgsnd()
  4. 读取消息:可以按照消息的类型从消息队列中读取msgrcv()
  5. 删除消息队列: msgctl()

6.shell命令 

ipcs -q: 查看消息队列

ipcrm -q msgid: 删除消息队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值