Linux----多进程通讯

首先要知道 进程间要完成通讯,至少要有一个可以进程共享的标记

进程之间通讯总共有四种方式,下面分别来分析

一、管道
管道又分为有名管道和无名管道。
(1)有名管道
在磁盘上有1个文件标识,创建管道文件,但是交互的数据并不会存储在磁盘上,管道文件并不会占据磁盘空间,如下图所示

在这里插入图片描述
A、B两个进程通过管道文件(文件系统)访问内存上的同一块区域
(2)无名管道
借助于父子进程共享在fork之前打开的文件描述符,通过无名管道完成通信,不会创建管道文件
只能应用于父子进程之间
在这里插入图片描述
父子进程对于共享的文件描述符都可以分别进行读写操作,因此:在父子进程执行前,必须分别关闭一对读写
管道的通讯方式:半双工通信

消息队列、信号量、共享内存共享的是内核对象

二、消息队列
消息即就是(标识符)+ 数据
队列:一种先进先出的结构
使用:
(1)创建或获取内核对象
int msgget(key_t key,int msgflag);

(2)通过内核对象完成通讯
发送数据 int msgsnd(int msgid,void *ptr,size_t nbytes,int flag);
ptr指向的是准备发送消息的指针,指向的结构
struct msgdata
{
long mtypes;//类型
char mtext[128];//数据
};
nbytes 数据部分的实际长度
(3)接收消息
int msgrcv(int msgid,void *ptr,int nbytes,long type,int flag);
ptr指向msgdata结构,用于保存收到的信息
nbytes:指定接收数据的缓冲区大小
type:本次接收数据-----根据这个就可以实现数据的定向发送与接收

1、接收消息的进程只接受指定类型的消息,其他消息一概不管,发送端就可以指定数据发送给哪个进程
2、消息队列并不是准确的先入先出的,而是在特定类型上先进先出的

三、信号量
类似于一个计数器,当其值大于0时,记录临界资源的个数,等于0时,其他需要使用临界资源的进程就必须阻塞---------控制进程同步的一种机制
信号量的内核对象----是为了使多个进程访问到同一个信号量
内核维护的内核对象记录的是一个信号量集
四、共享内存
系统上的每个进程都有4G的虚拟地址空间,而进程的真实的物理地址空间都是独立的

共享内存就是在真实的物理地址空间上找一块空间,使得多个进程都能访问到这块空间
在这里插入图片描述
A进程和B进程分别保存两个虚拟地址,这两个地址可以相同也可以不同,但是其映射的物理空间是相同的

使用:
(1)创建内核对象,并且申请物理内存
(2)各进程中,分别将自己的虚拟地址通过内核对象映射到开辟的物理内存上(链接)
(3)分别访问这块内存,通过ptra,ptrb
(4)断开链接,将虚拟地址与物理内存断开联系
(5)删除内核对象

共享内存在使用时,会比管道少两次数据的拷贝,是最快的一直IPC

共享内存对于多进程来说就是一块临界资源,多进程使用共享内存时就必须做到同步控制(信号量)

四种通讯过程的比较

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值