当前位置: 首页 > news >正文

IPC之管道

什么是管道?
管道的本质是操作系统在内核中创建出的一块缓冲区,也就是内存

管道的应用
$ ps aux | grep xxx
ps aux 的标准输出写到管道,grep 从管道这块内存中读取数据来作为它的一个标准输入,而且 ps 和 grep 之间是兄弟关系,因为二者的父进程都是 bash

一、匿名管道

功能:创建一个匿名管道#include <unistd.h>
int pipe(int fd[2]);
输出型参数 fd:文件描述符数组,其中,fd[0] 是读端,fd[1] 是写端
返回值:成功返回 0失败返回 -1,并设置错误码

一个进程通过系统调用 pipe() 创建出一个匿名管道,操作系统就会在内核中创建一块没有明确标识的缓冲区,并返回给创建进程两个文件描述符作为管道的操作句柄供进程来操作管道,其中,一个文件描述符(fd[0])用于从管道中读,另一个(fd[1])用于往管道中写,返回两个文件描述符是为了让用户自己确定半双工的方向

由于匿名管道对应的这块缓冲区没有明确标识,这也就意味着其他进程无法找到该缓冲区,也就无法通信,因此匿名管道只能用于具有亲缘关系的进程间通信,因为子进程能复制父进程的文件描述符表

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define ERR_EXIT(m)       \{                       \perror(#m" error\n"); \exit(EXIT_FAILURE);   \}int main()
{int   fds[2];pid_t pid;char  buf[10] = {0};if (0 != pipe(fds))ERR_EXIT(pipe)pid = fork();if (-1 == pid)ERR_EXIT(fork)if (0 == pid){close(fds[0]);  //关闭读端printf("child write data: hello\n");write(fds[1], "hello", 5);close(fds[1]);exit(0);}close(fds[1]);  //关闭写端read(fds[0], buf, sizeof(buf));printf("father read data: %s\n", buf);close(fds[0]);waitpid(pid, NULL, 0);return 0;
}
/** child write data: hello* father read data: hello */

通过上述示例,我们发现在操作匿名管道的时候完全是把它当作文件去使用的,抛开 Linux 一切皆文件的思想,主要还是因为这块内存是在内核中,用户态的代码没法直接操作,但是可以借助文件读写的系统函数来操作这块内存

特点
1、只能用于具有亲缘关系的进程,像 ps aux | grep xxx 这种兄弟进程等
2、提供流式服务,也就是面向字节流

  • 优点:读写灵活,一次性写 10 字节,分 10 次读,或 5 次读或……,也可以 1 字节/次分 10 次写
  • 缺点:存在粘包问题,原因是两条数据间没有明显的间隔

3、半双工通信(可以选择方向的单向传输,a 可以给 b 发,b 也可以给 a 发,但是确定好方向后就只能这么发了,此外还有全双工通信、单工通信(已经确定好方向的单向传输)),双方彼此都进行通信时,需要创建两个匿名管道
4、进程退出,匿名管道被释放,也就是匿名管道的生命周期随进程,这里的进程指持有匿名管道的最后一个进程,当然也可以主动关闭所有进程的有关匿名管道的那两个文件描述符
5、内核会对匿名管道操作进行同步与互斥

二、命名管道

内核中的一块有明确标识的缓冲区,该标识实际上是一个管道文件(p),可见于文件系统,这也就意味着同一主机上的任意进程都可以通过打开管道文件进而访问到内核中对应的缓冲区进行通信

注意,管道文件并不是命名管道的本体,仅是命名管道的入口,即便通过 mkfifo 命令/函数创建出管道文件,内核中也并没有与之对应的缓冲区

$ mkfifo myfifo
$ ll myfifo
prw-rw-r-- 1 mam mam 0 318 16:16 myfifo

功能:创建一个管道文件#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
返回值:成功返回 0失败返回 -1,并设置错误码$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>#define MYFIFO  "./myfifo"int main()
{
#if 0umask(0);  // prw-rw-rw-
#else/** prw-rw-r--* because 0666 & ~022 = 0644*/
#endifif (mkfifo(MYFIFO, 0666) < 0&& EEXIST != errno){perror("mkfifo error");return EXIT_FAILURE;}printf("successfully create FIFO file '%s'\n", MYFIFO);return 0;
}

命名管道打开规则

利用匿名管道实现文件拷贝 demo

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MYFIFO  "./myfifo"
#define S_FILE  "./test.txt"#define ERR_EXIT(m)       \{                       \perror(#m" error\n"); \exit(EXIT_FAILURE);   \}int main()
{int  ifd = -1, ofd = -1;char buf[1024];int  n;umask(0);if (mkfifo(MYFIFO, 0666) < 0&& EEXIST != errno)ERR_EXIT(mkfifo)ifd = open(S_FILE, O_RDONLY);if (ifd < 0)ERR_EXIT(open)ofd = open(MYFIFO, O_WRONLY);if (ofd < 0)ERR_EXIT(open)while ((n = read(ifd, buf, sizeof(buf))) > 0){if (n != write(ofd, buf, n)){printf("write error\n");return EXIT_FAILURE;}}close(ifd);close(ofd);return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MYFIFO  "./myfifo"
#define D_FILE  "./test.txt.bak"#define ERR_EXIT(m)       \{                       \perror(#m" error\n"); \exit(EXIT_FAILURE);   \}int main()
{int  ifd = -1, ofd = -1;char buf[1024];int  n;umask(0);ifd = open(MYFIFO, O_RDONLY);if (ifd < 0)ERR_EXIT(open)ofd = open(D_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0666);if (ofd < 0)ERR_EXIT(open)while ((n = read(ifd, buf, sizeof(buf))) > 0){if (n != write(ofd, buf, n)){printf("write error\n");return EXIT_FAILURE;}}close(ifd);close(ofd);unlink(MYFIFO);return 0;
}

特点
1、可用于同一主机上的任意进程间通信,这是命名管道和匿名管道的最大区别
2、面向字节流
3、半双工通信
4、进程退出,命名管道被释放,但命名管道文件还在
5、内核会对命名管道操作进行同步与互斥

三、管道读写规则

相关文章:

IPC之管道

什么是管道&#xff1f; 管道的本质是操作系统在内核中创建出的一块缓冲区&#xff0c;也就是内存 管道的应用 $ ps aux | grep xxx ps aux 的标准输出写到管道&#xff0c;grep 从管道这块内存中读取数据来作为它的一个标准输入&#xff0c;而且 ps 和 grep 之间是兄弟关系&a…...

VUE-组件间通信(二)$emit

$emit 1、单向绑定 子组件向父组件传值 2、使用示例 父组件 <template><div id"app"><!-- 监听自定义触发事件 emitInvokeEvents--><SonDemo emitInvokeEvents"fatherFunction"></SonDemo></div> </template&…...

java 程序连接 redis 集群 的时候报错 MUTLI is currently not supported in cluster mode

找了半天找不到,为什么国内文章环境是真的差&#xff0c; redis 集群不支持事务&#xff0c;而你的方法上面估计使用了 spring 的事务导致错误具体解决&#xff1a; Transactional(propagation Propagation.NOT_SUPPORTED)public <T> void removeMultiCacheMapValue…...

AVP-SLAM:自动泊车系统中的语义SLAM_

AVP-SLAM&#xff1a;自动泊车系统中的语义SLAM 附赠最强自动驾驶学习资料&#xff1a;直达链接 ●论文摘要 在自动代客泊车系统中车辆在狭窄且拥挤且没有GPS信号的停车场中进行导航&#xff0c;具备准确的定位能力是至关重要的。传统的基于视觉的方法由于在停车场中由于缺少…...

PHP反序列化--pop链

目录 一、了解pop链 1、pop链&#xff1a; 2、pop链触发规则&#xff1a; &#xff08;1&#xff09;通过普通函数触发&#xff1a; &#xff08;2&#xff09;通过魔术方法触发&#xff1a; 3、pop链魔术方法例题&#xff1a; 一、了解pop链 1、pop链&#xff1a; pop链…...

单片机中的几种周期(振动/时钟,状态,机械,指令周期)表示的含义(51为例)

几种周期含义及个人理解描述 参考&#xff1a;短文&#xff0c;参考&#xff0c;百度 个人理解简述&#xff1a;对于几个周期性来说&#xff0c;可以认为是小单位的时间组合成了长时间。就像把一个数据赋值&#xff0c;这个是简单的一个机械周期能完成的动作&#xff0c;但需要…...

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

【学习总结】Ubuntu中vscode用ROS插件调试C++程序

1、教程 参考博客&#xff1a; 【ROS】 在VScode中 ROS Debug 配置方法非常详细版 关于launch文件的配置&#xff1a; launch.json {"version": "0.2.0","configurations": [{"name": "ROS: Launch","request"…...

html--蝴蝶

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>蝴蝶飞舞</title> <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.cs…...

线程的 sleep()方法和 yield()方法有什么区别?为什么 Thread 类的 sleep()和 yield ()方法是静态的?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 线程的 sleep()方法和 yield()方法有什么区别 sleep()方法: sleep()方法使当前线程进入休眠状态,即暂停执行一段时间。它是静态方法,属于Thread类,调用…...

Java进阶 Maven基础

资料格式 配置文件 com.itheima Java代码 Statement stat con.createStatement(); 示例 com.itheima 命令 mvn test - Maven简介 传统项目管理状态分析 Maven 是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发过程抽象成一个项目对象模型&#xff08;POM&…...

Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析

1 Apache Tika 介绍 Apache Tika 是一个开源的内容检测和分析框架,由Apache软件基金会开发和维护的顶级项目。它可以从各种格式的文件中提取元数据和文本内容。Tika非常适合处理全文搜索、内容分析、翻译、内容提取等需要大量处理和分析文档内容的任务。Apache Tika提供了多种…...

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码...

面试经典150题(114-118)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天完成了5道(114-118)150 gap 了一周&#xff0c;以后就不记录时间了。。 114.(70. 爬楼梯) 题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…...

HTML表单标签详解:如何用HTML标签打造互动网页?

在互联网的世界中&#xff0c;表单是用户与网站进行互动的重要桥梁。无论是注册新账号、提交反馈、还是在线购物&#xff0c;表单都扮演着至关重要的角色。在网页中&#xff0c;我们需要跟用户进行交互&#xff0c;收集用户资料&#xff0c;此时就需要用到表单标签。 HTML提供…...

Web 服务器-Tomcat

文章目录 Web服务器一、Tomcat简介二、基本使用三、在IDEA中创建Maven Web项目四、在IDEA中使用Tomcat Web服务器 一、Tomcat简介 二、基本使用 三、在IDEA中创建Maven Web项目 四、在IDEA中使用Tomcat...

(德迅零域)微隔离安全平台是什么,有什么作用?

网络隔离并不是新的概念&#xff0c;而微隔离技术&#xff08;Micro-Segmentation&#xff09;是VMware在应对虚拟化隔离技术时提出来的&#xff0c;但真正让微隔离备受大家关注是从2016年起连续3年微隔离技术都进入Gartner年度安全技术榜单开始。在2016年的Gartner安全与风险管…...

这些问题,每年软考报名时都有人问

​​软考报名实行网上在线报名的方式&#xff0c;每次在报名期间&#xff0c;考生都会遇到各种各样的问题&#xff0c;本文挑选了一些大家问的比较多的问题进行了解答&#xff0c;希望对大家有所帮助。 1、软考报名资格审核要审核多久&#xff1f; 一般来说审核时间在3个工作…...

JavaScript爬虫进阶攻略:从网页采集到数据可视化

在当今数字化世界中&#xff0c;数据是至关重要的资产&#xff0c;而网页则是一个巨大的数据源。JavaScript作为一种强大的前端编程语言&#xff0c;不仅能够为网页增添交互性&#xff0c;还可以用于网页爬取和数据处理。本文将带你深入探索JavaScript爬虫技术的进阶应用&#…...

MATLAB教程

目录 前言一、MATLAB基本操作1.1 界面简介1.2 搜索路径1.3 交互式命令操作1.4 帮助系统 二、MATLAB语言基础2.1 数据类型2.2 MATLAB运算2.2.1 算数运算2.2.2 关系运算2.2.3 逻辑运算 2.3 常用内部函数2.4 结构数据与单元数据 三、MATLAB程序设计3.1 M文件3.2 函数文件3.3 程序控…...

告别依赖地狱:用Buildroot一键搞定OpenCV 4.x在ARM板上的交叉编译环境

告别依赖地狱&#xff1a;用Buildroot一键搞定OpenCV 4.x在ARM板上的交叉编译环境 在嵌入式视觉应用开发中&#xff0c;OpenCV几乎是不可或缺的计算机视觉库。但当开发者尝试将OpenCV部署到ARM架构的嵌入式设备时&#xff0c;往往会陷入依赖库编译的泥潭——FFmpeg、libjpeg、l…...

League-Toolkit:基于LCU API的英雄联盟效率工具集

League-Toolkit&#xff1a;基于LCU API的英雄联盟效率工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一…...

论文检测「生死局」破局指南:Paperxie 四大降重方案,精准对抗知网 / 维普 AIGC 检测

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述https://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 凌晨三点的电脑屏幕前&#xff0c;你盯着知网 AIGC 检测报告上刺眼的「99.8% 疑似度」&#xff0c;指尖冰凉 —— 刚写完的毕…...

Windows系统下Python 3.11环境配置全攻略

1. Python 3.11环境配置前的准备工作 在开始安装Python 3.11之前&#xff0c;我们需要做一些准备工作。首先确认你的Windows系统版本&#xff0c;右键点击"此电脑"选择"属性"&#xff0c;在系统类型中查看是32位还是64位系统。Python 3.11官方已经停止对32…...

从Kinect到奥比中光:为什么我的深度学习项目选了Gemini 2L?附Python SDK踩坑实录

从Kinect到奥比中光&#xff1a;为什么我的深度学习项目选了Gemini 2L&#xff1f;附Python SDK踩坑实录 深度视觉技术正在重塑人机交互的边界。当我的团队启动一个需要实时三维重建的农业机器人项目时&#xff0c;我们面临着一个关键抉择&#xff1a;在众多深度相机品牌中&…...

SEO_从入门到精通,掌握SEO的核心操作步骤

<h2>SEO从入门到精通&#xff0c;掌握SEO的核心操作步骤</h2> <p>在当今的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为任何网站或网页希望获得高流量、高曝光的关键技能。无论你是一个初学者&#xff0c;还是已经有一些SEO基础的…...

AI 辅助开发实战:基于低代码与智能生成的五金店管理系统毕设架构设计

最近在帮学弟学妹们看毕业设计&#xff0c;发现“五金店管理系统”是个高频选题。但很多人做着做着就陷入了“增删改查”的泥潭&#xff0c;前端界面简陋&#xff0c;业务逻辑也写得七零八落&#xff0c;最后答辩时演示效果平平&#xff0c;技术深度更是无从谈起。这让我开始思…...

Qt项目里用dxflib解析CAD图纸,遇到带圆弧的多段线(LWPOLYLINE)怎么画?

Qt项目中利用dxflib解析CAD图纸&#xff1a;带圆弧多段线(LWPOLYLINE)的精确绘制方案 在工业设计、建筑图纸和机械制图领域&#xff0c;DXF文件作为CAD数据交换的标准格式&#xff0c;其精确解析一直是开发者的核心挑战。当使用Qt框架结合dxflib库进行CAD可视化时&#xff0c;优…...

基于YOLOv10深度学习的管道泄漏检测系统(YOLOv10+YOLO数据集+UI界面+Python项目+模型)

一、项目介绍 项目摘要 随着工业管道运输系统的日益复杂化&#xff0c;管道泄漏事故不仅会造成巨大的经济损失&#xff0c;还可能引发严重的环境污染和安全事故。为了实现对管道泄漏的快速、准确识别&#xff0c;本研究提出了一种基于YOLOv10深度学习模型的智能管道泄漏检测系…...

2026电商客服外包TOP5实力品牌详细解读

进入2026年&#xff0c;电商行业已从粗放式扩张转向精细化运营时代&#xff0c;客户服务不再局限于简单的问答回复&#xff0c;而是成为驱动店铺销售增长、积累品牌声誉的关键要素。根据最新行业研究报告&#xff0c;专业的外包客服团队能够帮助店铺将询单转化率提高20%-30%&am…...