进程的五种通信方式

2023-11-14

一、管道

1、什么是管道

我们把一个进程连接到另一个进程的数据流称为一个管道。它是最古老的进程通信形式。

2、原型(匿名管道):

#include <unistd.h>
功能:创建⼀⽆名管道
原型
int pipe(int fd[2]);
参数
fd:⽂件描述符数组,其中fd[0]表⽰读端, fd[1]表⽰写端
返回值:成功返回0,失败返回错误代码

3.管道的特点

 (1).只能用于拥有共同祖先的进程进行通信,通常一个进程先创建管道,然后该进程调用fork,然后父子进程便可以一同应用此管道。

(2).管道提供流式服务。

(3).一般而言,进程退出管道释放,管道的生命周期随进程。

(4).一般而言,内核会对管道操作进行同步与互斥。

(5).管道是半双工,数据只能向一个方向流动,如果要实现双方通信时,则需要建立两个管道。

二、命名管道

1.建立原因:管道本只能在拥有共同祖先的进程之间通信,若想在无关进程之间通信,那么则使用FIFO文件来实现,被称为命名管道。

2.创建命名管道

(1)命名管道可以从命令行创建

$ mkfifo filename

(2).命名管道也可以在程序中创建

int mkfifo(const char* filename, mode_t mode);

(3)创建命名管道

int main(int argc, char *argv[])
{
 mkfifo("p2", 0644);
 return 0;
}

3.匿名管道与命名管道的区别:

  • 匿名管道由pipe创建并打开
  • 命名管道由mkfifo创建,由open打开
  • 两者唯一的区别就是创建和打开的方式不同,一旦这些完成之后,他们具有相同的语义

三、消息队列

1、概念

  • 消息队列提供了从一个进程向另一个进程发送一块数据的方法。
  • 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型。
  • 消息队列的不足是消息队列有最大长度的限制(MSGMAX),并且还有字节数的限制(MSGMNB),消息队列的总数也有限制(MSGMNI)。

2.原型:

(1).msgget()函数

功能:⽤来创建和访问⼀个消息队列
原型
 int msgget(key_t key, int msgflg);
参数
 key: 某个消息队列的名字
 msgflg:由九个权限标志构成,它们的⽤法和创建⽂件时使⽤的mode模式标志是⼀样的
返回值:成功返回⼀个⾮负整数,即该消息队列的标识码;失败返回-1

(2)msgctl()函数

功能:消息队列的控制函数
原型
 int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数
 msqid: 由msgget函数返回的消息队列标识码
 cmd:是将要采取的动作,(有三个可取值)
返回值:成功返回0,失败返回-1

(3)msgsnd()函数

功能:把⼀条消息添加到消息队列中
原型
 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数
 msgid: 由msgget函数返回的消息队列标识码
 msgp:是⼀个指针,指针指向准备发送的消息,
 msgsz:是msgp指向的消息⻓度,这个⻓度不含保存消息类型的那个long int⻓整型
 msgflg:控制着当前消息队列满或到达系统上限时将要发⽣的事情
 msgflg=IPC_NOWAIT表⽰队列满不等待,返回EAGAIN错误。
返回值:成功返回0;失败返回-1

(4).msgrcv()函数

功能:是从⼀个消息队列接收消息
原型
 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
参数
 msgid: 由msgget函数返回的消息队列标识码
 msgp:是⼀个指针,指针指向准备接收的消息,
 msgsz:是msgp指向的消息⻓度,这个⻓度不含保存消息类型的那个long int⻓整型
 msgtype:它可以实现接收优先级的简单形式
 msgflg:控制着队列中没有相应类型的消息可供接收时将要发⽣的事
返回值:成功返回实际放到接收缓冲区⾥去的字符个数,失败返回-1

四、共享内存

(1).shmget函数

功能:⽤来创建共享内存
原型
 int shmget(key_t key, size_t size, int shmflg);
参数
 key:这个共享内存段名字
 size:共享内存⼤⼩
 shmflg:由九个权限标志构成,它们的⽤法和创建⽂件时使⽤的mode模式标志是⼀样的
返回值:成功返回⼀个⾮负整数,即该共享内存段的标识码;失败返回-1

(2).shmat函数

功能:将共享内存段连接到进程地址空间
原型
 void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
 shmid: 共享内存标识
 shmaddr:指定连接的地址
 shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回⼀个指针,指向共享内存第⼀个节;失败返回-1

(3).shmdt函数

功能:将共享内存段与当前进程脱离
原型
 int shmdt(const void *shmaddr);
参数
 shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段

(4).shmctl函数

功能:⽤于控制共享内存
原型
 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
 shmid:由shmget返回的共享内存标识码
 cmd:将要采取的动作(有三个可取值)
 buf:指向⼀个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

五、信号量

信号量本质上是一个计数器

信号量结构体伪代码:

struct semaphore
{
 int value;
 pointer_PCB queue;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程的五种通信方式 的相关文章

  • css 水平垂直居中的几种常见方式

    下面是几种常见的水平垂直居中方式 可在不同情形下方便采用不同的方式 html div class box div class content div div 共同的css content width 50 height 50 margin
  • C++中的STL中map用法详解

    map用法详解 Map是STL的一个关联容器 它提供一对一的数据处理能力 由于这个特性 它完成有可能在我们处理一对一数据的时候 在编程上提供快速通道 这里说下map内部数据的组织 map内部自建一颗红黑树 一 种非严格意义上的平衡二叉树 这
  • Python 日志-装饰器

    参考文章 程序员小谭 自动化项目实战08 日志 插入脚本展示 代码实现 def write case log def wrapper func func wraps func 防止函数名称与注释文档被重写 def inner func ar
  • listview 弹窗效果实现 +类似qq的滑动删除效果

    需求 点击ListItem 后 在item上弹出一个类似PopupWindows 的东西里面的选项根据Item的不同可以或多或少 比如说歌曲列表 有的只有下载和收藏 但有的还有mv等其他选项 昨天参考了gitHub上的一个例子 https
  • JVM GC

    文章目录 GC 核心概述 Java 自动化内存管理 什么是垃圾 内存碎片的概念 为什么需要 GC GC 相关算法对比 垃圾回收相关算法 标记阶段 引用计数算法 标记阶段 可达性分析算法 清除阶段 标记 清除 Mark Sweep 算法 清除
  • C++ 基类与派生类

    基类的私有成员在派生类中可以被继承 用sizeof也可以证明 但是不能直接访问 可以通过间接方式访问到 不能在派生类中用派生类函数调用访问 必须借助于继承的基类的公有成员函数访问基类的私有成员 C 为了确保程序员不会把系统内置类型的运算符进
  • 【Python练习:幸运7游戏】:使用随机数生成函数randrange()模仿筛子点数和判断概率问题,多次迭代求规律

    Python练习题 幸运7游戏 随机数的应用 题目 赌场中有一种称为 幸运7 的游戏 游戏规则是玩家掷两枚骰子 如果其点数和为7 玩家赢4元 如果不是7 玩家就输1元 请你分析一下 这样的规则是否公平 知识准备 这里用到一个python库自
  • mybatis连接mysql url_MyBatis与JDBC连接数据库所使用的url之间的差异

    在Windows7 系统上安装了MySQL 8 0 然后创建Maven工程 配置pom xml文件 添加了如下依赖 org mybatis mybatis 3 4 6 mysql mysql connector java 8 0 11 1
  • 如何保证某个函数只被调用一次

    From http www cnblogs com baiyanhuang archive 2010 11 13 1876677 html 一个函数caller会在其内部调用另外一个函数callee 现在的情况是 caller可能会在多个地
  • 智能指针原理剖析(一):auto_ptr、unique_ptr

    通过常规指针管理动态内存的难点及缺点 1 忘记释放动态内存 使用new malloc分配动态内存时 需要使用delete free手动释放内存 但程序员容易忘记释放内存 从而产生内存泄露 2 动态内存释放时机不对 在尚有指针引用内存的情况下
  • 【老生谈算法】matlab实现图像压缩算法源码——图像压缩

    Matlab的图像压缩技术源码 1 文档下载 本算法已经整理成文档如下 有需要的朋友可以点击进行下载 序号 文档 点击下载 本项目文档 老生谈算法 Matlab的图像压缩技术 docx 2 算法详解 一 目的要求 掌握Matlab图像图像压
  • 零基础学习Java经常犯的错误有哪些?

    Java是一种复杂的编程语言 在很长一段时间内一直主导着许多生态系统 可移植性 自动垃圾收集及其温和的学习曲线使其成为软件开发中的绝佳选择 但是 与任何其他编程语言一样 它仍然容易受到开发人员错误的影响 本文探讨了Java开发人员最常犯的几
  • Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

    Vue Element UI 实现权限管理系统 前端篇 十四 菜单功能实现 菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作 提供一个菜单查询接口 查询整颗菜单树形结构 http modules menu js 添加 f
  • Java爬虫技术(一)普通网站爬取图片

    爬虫简单介绍 用户和网站服务器的操作如下 而爬虫需要做的是模拟仿照用户机 去向服务器发送请求数据 并接受响应数据 接着去解析数据 获得我们想要的数据 步骤大致分为 准备好要爬取的网址 定义爬虫的参数 开始爬 获取爬取的数据 使用xpath技
  • 未来两年以调试osgearth源码为主线,且整合GIS引擎

    按照 https blog csdn net hankern category 9281734 html 本来以为每天调试一节就可以了 没想到 试了3周 结果只调试了3节 平均每周一节 那么就要用2年左右了 花费这么长时间 值不值得呢 跳出
  • com.alibaba.easyexcel导出EXCEL文件

    com alibaba easyexcel导出EXCEL文件 1 POM XML
  • Redis安装配置

    1 下载 http redis io download 2 安装 安装C语言环境 已经安装可跳过 yum install gcc c 下载压缩包 wget http download redis io releases redis 4 0
  • Windows 运行窗口(win+r)常用命令

    打开运行窗口方法 windows系统电脑中 直接按键盘快捷键 win r 通过点击左下角搜索图标 输入 运行 进行搜索 就能找到 运行 点击之后即可打开运行窗口 点击左下角开始程序图标 然后点击 windows系统 之后 点击 运行 即可打
  • 曼彻斯特编码/差分曼彻斯特编码

    1 曼彻斯特编码 Manchester Encoding 位中间电平从低到高跳变表示 0 位中间电平从高到低跳变表示 1 2 差分曼彻斯特编码 differential Manchester encoding 在最初信号的时候 即第一个信号
  • stm32最小系统板烧录的简单说明

    首先 最小系统板烧录往往需要usb转串口模块 可以自行购买 一般买了会附送资料 上面都会有相应的驱动 根据以往的经验来看 这个模块的驱动经常出问题 比如一直显示占用 装了之后需要手动切换 具体可百度 就是打开设备管理器 点击相应com端口

随机推荐

  • Kubernetes 常见问题总结

    如何删除不一致状态下的 rc deployment service 在某些情况下 经常发现 kubectl 进程挂起现象 然后在 get 时候发现删了一半 而另外的删除不了 root k8s master kubectl get f flu
  • css实现勾号 √

    check position relative display inline block width 25px height 25px background red border radius 25px check after conten
  • 经典CNN卷积神经网络发展史+论文+网络实现(PyTorch)

    网络搭建目录 Lenet 学习笔记 pytorch官方demo代码复现 放风筝的猪的博客 CSDN博客 AlexNet网络结构详解与代码复现 放风筝的猪的博客 CSDN博客 VGG网络结构详解与代码复现 感受野计算 放风筝的猪的博客 CSD
  • qt制作播放器-进度条属性设置

    QSlider groove horizontal border 1px solid 4A708B background C0C0C0 height 30px border radius 1px padding left 1px paddi
  • Centos8安装WPS

    下载安装包 到wps官网下载linux版本的安装包 根据自己的linux是 32 位还是64位的 下载对应的安装包 我下载的是64位的rpm包 下载地址 http www wps cn product wpslinux 安装目录 如果想安装
  • Unix哲学

    Unix哲学 起源于Ken Thompson在早期关于如何设计一个设计接口简洁 小巧精干的操作系统的思考 随着Unix文化在学习如何尽可能发掘Thompson设计思想的过程中不断成长 同时它还一路上博采众长 Unix哲学并不是一个正规的设计
  • Vue-ElementUI实现前端多选框切换分页选择保留之前选的数据,分页选择、回显功能

    前端页面开发经常会遇到切换分页时 之前页面选的数据不会保存以及选择的数据如何回显的问题 然后之前写的方法还有个bug 新增数据时 选择多个分页的数据保存后 进入编辑页 如果直接保存的话只会提交首页选择的数据 如果是分页一页一页点击过去 最后
  • ==和equals区别

    对于基本数据类型 byte short char int float double long boolean 比较的是值 他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的 对于这样的字符串 123 也是相同的道理 在常量池
  • java取出每年的七夕情人节日期

    83 java取出每年的七夕情人节日期
  • deactivate不能关闭venv

    python virtualenv deactivate 命令无法正常关闭venv虚拟环境 用的是python3 用vritualenv封装项目后发现 venv目录下没有bin目录 activate文件和deactivate文件在Scrip
  • 中小企业实施MES管理系统,这几点需要注意

    制造业是中国经济命脉所系 是立国之本 强国之基 作为世界制造大国 制造业一直是热门话题 当下 中小制造企业的产业地位不断提升 想要规范生产制造 提升产品竞争力 进行实施MES管理系统解决方案的企业越来越多 那么企业应该如何选型才能保证生产管
  • swift UITextField 设置leftView不生效

    swift 给UITextField 设置了 leftView 但是不显示 设置UITextField的光标输入位置 设置UITextField的leftView 但是没显示 视图层上也没有 let iamgeView UIImageVie
  • macOS Monterey 12.0.1 App闪退问题

    Apple还是一贯的尿性 m1升级了最新的macOS Monterey 12 0 1 发现了一些App闪退 CleanMyMac X 偏好设置 gt 通用 gt 取消 声音 这个选项 重新启动就不会闪退了 MWeb 去AppStore下载了
  • 数电常混淆的知识点(结合FPGA)

    组合逻辑最大的缺点就是会存在竞争冒险 这种竞争冒险问题是非常危险的 常常会引起电路的不稳定性和工作时的不确定性 时序逻辑就可以极大地避免上面的问题 从而使系统更加稳定 时序逻辑最基本的单元就是寄存器 寄存器具有存储功能 一般是由 D 触发器
  • 组合逻辑与时序逻辑的综合

    目录 1 综合简介 1 1 逻辑综合 1 2 RTL综合 1 3 高级综合 2 组合逻辑的综合 2 1 优先级结构的综合 2 2 利用逻辑无关紧要条件 2 3 ASIC单元与资源共享 3 带锁存器的时序逻辑综合 3 1 锁存器的无意综合 3
  • ‘StringArray‘ object has no attribute ‘tolist‘的处理方法

    先看原代码 sams pd array 2weq 2 2432 2 2ewq 2 2ew 1 sam pd unique sams sam tolist 想要利用pd的unique函数将列表里的数据进行去重处理 但是其返回的是一个np ar
  • 无影云桌面

    概念 无影云桌面 是阿里云推出的一台放在云上的超级电脑 这是基于云计算和虚拟化技术的云上桌面服务 通过客户端登录云桌面之后 就像操作本地电脑一样 在云端电脑完成开发 办公 并且数据都在云端 在任何地方都可以登录访问 最近体验了一段时间 操作
  • bazel build //:go

    作者简介 何 源 古典互联网从业者 2014年底加入英语流利说 目前主要负责 Platform Team 来流利说工作之前 在 the Plant 杭州工作 内 容 大 纲 1 程序包管理 Package Management 2 代码管理
  • ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析

    目录 1 课堂内容 2 知识储备 3 编程 1 课堂内容 读取OMI数据 HDF5 并输出为Geotiff文件 最重要的是数据的处理以及输出 这里我个人觉得难度不大 第一 获取OMI文件的NO2数据集的数据以及对数据中的异常值做处理 譬如全
  • 进程的五种通信方式

    一 管道 1 什么是管道 我们把一个进程连接到另一个进程的数据流称为一个管道 它是最古老的进程通信形式 2 原型 匿名管道 include