【linux】进程间通信1--管道

文章目录

  • 进程间通信
    • 是什么?
    • 如何做?
  • 管道
    • 匿名管道
    • 命名管道


进程间通信

是什么?

进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同的进程之间进行数据交换、信息传递和同步操作的机制。在多任务操作系统中,不同的进程可能同时运行,它们之间可能需要进行数据共享、协作完成某项任务等操作,这就需要进程间通信。
进程间通信目的:

  1. 数据传输:一个进程需要将它的数据发送给另一个进程
  2. 资源共享:多个进程之间共享同样的资源。
  3. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  4. 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

如何理解进程间通信:本质是让不同的进程看到同一份资源

  1. 那如何让不同进程看到同一份资源呢?
  2. 资源又是什么呢?

如何做?

进程间通信的分类:
管道

  1. 匿名管道pipe
  2. 命名管道

System V IPC

  1. System V 消息队列
  2. System V 共享内存
    3 .System V 信号量

POSIX IPC

  1. 消息队列
  2. 共享内存
  3. 信号量
  4. 互斥量
  5. 条件变量
  6. 读写锁

本篇重点介绍管道

管道

管道是Unix中最古老的进程间通信的形式,所谓的“管道”,指的是从一个进程连接到另一个进程的一个数据流
在这里插入图片描述
如何理解?
对于一个文件,我们普遍印象如下图,进程打开文件,通过写(读)操作,写入(读取)文件缓冲区,再由文件缓冲区刷新到磁盘里。
在这里插入图片描述
现在有一类文件,它抛弃了最后一步,即将缓冲区的内容刷新到磁盘上,所有操作仅在内存上完成。这一类文件即是内存级文件
假如现在该进程创建了一个子进程,子进程会继承父进程的file_struct,故都指向了一个内存级文件,现在我们便实现了让不同的进程看到同一份资源。然后我们让父进程和子进程一个只读,一个只写,不就可以实现两者进行单向通信了吗?而这种特殊的文件就是管道。这也符合linux下一切皆文件的观点。
在这里插入图片描述
管道有两种,匿名管道和命名管道。
匿名管道应用于具有血缘关系的进程
命名管道应用于无血缘关系的进程

匿名管道

#include <unistd.h>
功能:创建匿名管道
原型
int pipe(int pipefd[2]);
参数
pipefd:文件描述符数组,输出型参数,其中pipefd[0]存放读端的文件描述符, pipefd[1]存放读端的文件描述符
返回值:成功返回0,失败返回错误代码

管道通常是单向通信,主要是为了简化设计。如果要进行双向通信,那就创造两个管道。
在这里插入图片描述

#include <unistd.h>
#include <cassert>int main()
{//创建管道,让父进程写,子进程读int pipefd[2];int n = pipe(pipefd);assert(n != -1);pid_t id = fork();if(id == 0){//子进程 -- 读取管道close(pipefd[1]);//关闭写端,留下读端//……子进程接受数据close(pipefd[0]);exit(0);}else if(id > 0){//父进程 -- 写入管道close(pipefd[0]);//关闭读端,留下写端//……父进程写入数据 close(pipefd[1]);}return 0;
}

命名管道

上面讲到的匿名管道应用于具有血缘关系的管道,如果我们要让俩个不相干的进程进行通信,就要使用命名管道。

linux下有个命令mkfifo,它的作用是创造一个文件类型为p的文件。使用时:mkfifo filename 如下图:

在这里插入图片描述
命名管道和匿名管道的性质一样,是一种特殊的文件形式,不存储数据,只传递数据。
因此它的文件大小一直显示为0。
使用如下:
在这里插入图片描述

linux也提供了mkfifo的函数接口,如下
在这里插入图片描述

参数:mode即文件权限
下面是一个简单演示:

common.hpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define FIFO_PATH "./myfifo"
#define MODE 0664enum sfw
{FIFO_MKFIFO = 1,FIFO_OPEN,FIFO_READ,FIFO_UNLINK
};

client.cc

#include "common.hpp"using namespace std;int main()
{int fd = open(FIFO_PATH, O_WRONLY);if(fd < 0){perror("open");exit(FIFO_OPEN);}string line;while(1){cout << "clien sent# ";getline(cin, line);write(fd, line.c_str(), line.size());}close(fd);return 0;
}

server.cc

#include "common.hpp"using namespace std;int main()
{
//创建管道int n = mkfifo(FIFO_PATH, MODE);if(n == -1){perror("mkfifo");exit(FIFO_MKFIFO);}
//打开管道int fd = open(FIFO_PATH, O_RDONLY);if(fd < 0){perror("open");exit(FIFO_OPEN);}//while(1){char buffer[1024] = {0};int x = read(fd, buffer, sizeof(buffer));if(x > 0){buffer[x] = 0;cout << "clien say@ " << buffer << endl;}else if(x == 0){cout << "client quit" << endl;break;}else {perror("read");exit(FIFO_READ);}}close(fd);int x = unlink(FIFO_PATH);//删除管道if(x == -1){perror("unlink");exit(FIFO_UNLINK);}cout << "server quit" << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/278563.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数-Python

师从黑马程序员 函数初体验 str1"asdf" str2"qewrew" str3"rtyuio" def my_len(data):count0for i in data:count1print(f"字符串{data}的长度是{count}")my_len(str1) my_len(str2) my_len(str3) 函数的定义 函数的调用 函数名&a…

使用Navicat远程连接Linux中的MySQL

一、登录MySQL数据库 mysql -uroot -pXjm123456 二、使用mysql数据库 use mysql&#xff1b; 三、查询user表中包含host的字段 select user,host from user;### 该字段中&#xff0c;localhost表示只允许本机访问&#xff0c;可以将‘localhost’改为‘%’&#xff0c;‘%’表…

机器学习-04-分类算法-01决策树

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 参考 决策树——ID3和C4.5&#xff08;理论图解公式推导&#xff09; 策略产品经理必读系列—第七讲ID3、C4.5和CART算法详解 决策树&#xff08;…

高精度计算

主页&#xff1a;(*∇&#xff40;*) 咦,又好了~ xiaocr_blog &#xff08;1&#xff09;数据的接收方法和存储方法: 当输入的数据很长的时候&#xff0c;可采取字符串方式输入&#xff0c;这样可以输入位数很长的数&#xff0c;利用字符串函数和操作运算&#xff0c;将每一位…

Linux 常见驱动框架

一、V4L2驱动框架 v4l2驱动框架主要对象&#xff1a; &#xff08;1&#xff09;video_device&#xff1a;一个字符设备&#xff0c;为用户空间提供设备节点(/dev/videox)&#xff0c;提供系统调用的相关操作(open、ioctl…) &#xff08;2&#xff09;v4l2_device&#xff1a…

【大数据面试题】 018 数据仓库的分层了解吗?说说你的理解

一步一个脚印&#xff0c;一天一道面试题。 数据仓库是比较常见的考点。今天就介绍一下数据仓库的分层。本篇文章会较多的图片是来自尚硅谷的。 数据仓库的背景和好处 数据仓库的诞生就和大数据的诞生有很大的相似。大数据的诞生是为了处理超大的数据&#xff0c;并在其中探…

【Java Web基础】一些网页设计基础(一)

文章目录 1. 父盒子下子盒子的左右浮动布局2. 浮动布局中&#xff0c;高度较小的盒子撑起整个盒子的高度3. 在2中&#xff0c;logo和title都是顶着放置的&#xff0c;让logo和title垂直居中4. 字体大小自适应5. 响应式布局 1. 父盒子下子盒子的左右浮动布局 父盒子CSS&#xff…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

B端:列表页选表格还是卡片,有讲究的。

选择表格或卡片作为列表页的展示方式&#xff0c;各有其优缺点。下面是对表格和卡片的优缺点进行详细介绍&#xff1a; 表格的优点&#xff1a; 结构化展示&#xff1a;表格以行和列的形式展示数据&#xff0c;可以清晰地展示多个字段的信息&#xff0c;方便用户进行比较和筛选…

2、高级语言的语法描述

常用的高级程序设计语言 程序语言的定义 语法 一组规则&#xff0c;用它可以形成和产生合适的程序 词法规则&#xff1a;单词符号的形成规则。 单词符号的形成规则单词符号是语言中具有独立意义的最基本结构 一般包括:常数、标识符、基本字、算符、界符等 描述工具:有限自动机…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

&#x1f96e;背景 ComfyUI下使用IP-adapter下的faceID模型的时候&#xff0c;大家可能会遇到如下错误&#xff1a; Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…

ElasticSearch架构设计

一、基础概念 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作: 一个分布式的实时文档…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数&#xff08;如下&#xff09;&#xff0c;其他的参数可以不管 client_id &#xff1a; 就是创建应用后的API Keyclient_secret&#xff1a; 就是创建…

Docker 笔记(五)--链接

这篇笔记记录了Docker 的Link。 官方文档&#xff1a; Legacy container links - Communication across links 目录 参考Legacy container linksConnect using network port mappingConnect with the linking systemThe importance of naming Communication across linksEnviro…

3.18 day6 C++

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位进解员&#xff0c;他会为每种动 物表…

【闲聊】-后端框架发展史

框架&#xff0c;是为了解决系统复杂性&#xff0c;提升开发效率而产生的工具&#xff0c;主要服务于研发人员。 当然&#xff0c;框架还有更深层的作用&#xff0c;框架的沉淀是一种高级的抽象&#xff0c;会将人类的业务逐步抽象为统一标准又灵活可变的结构&#xff0c;为各行…

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

k8s helm 删除 tiller

kuberneter 上面装了 helm 想卸载还并不是那么简单, 参考 stackoverflow 回复 kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete kubectl get all -n kube-system -l apphelm -o name|xargs kubectl dele…

Morris法解决二叉树问题,展开链表及中序遍历

问题一&#xff1a;二叉树展开成单链表 问题二&#xff1a;二叉树中序遍历 咋一看非常简单的两道题&#xff0c;但是如果我们加以一些限制&#xff0c;这两题就不简单了。对于这两道题&#xff0c;我们的空间复杂度都必须控制在O(1)。也就是说&#xff0c;迭代和递归全部失效…