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

进程间通讯-管道

介绍

管道(Pipe)是操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,它允许一个进程的输出直接作为另一个进程的输入。管道主要分为以下两种类型:

  1. 无名管道(Unnamed Pipe)

    • 无名管道是半双工的,也就是说数据只能在一个方向上流动,要么从写入端流向读取端,要么反之。
    • 管道是存在于内存中的,由内核管理的一个缓冲区。
    • 管道的两端通过文件描述符(file descriptor)进行访问,通常是一个数组,如int fd[2],其中fd[0]用于读取,fd[1]用于写入。
    • 管道通常用于父子进程之间的通信,因为无名管道只能在具有亲缘关系的进程之间使用。
    • 当写入的数据超过管道的缓冲区容量时,写入操作会被阻塞,直到有进程从管道中读出数据。
  2. 命名管道(Named Pipe或FIFO,First-In-First-Out)

    • 命名管道是在文件系统中创建的一个特殊文件,因此它可以用于不相关的进程之间的通信。
    • 命名管道既可以用于半双工通信,也可以通过创建两个命名管道实现全双工通信。
    • 任何知道命名管道路径的进程都可以打开并使用它进行通信。
    • 命名管道的使用方式与普通文件类似,可以使用标准的文件I/O函数进行读写操作。

实现举例

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {int pipefd[2];pid_t cpid;char buf;if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}cpid = fork();if (cpid == -1) {perror("fork");exit(EXIT_FAILURE);}if (cpid == 0) {    // 子进程close(pipefd[1]);  // 关闭管道的写端while (read(pipefd[0], &buf, 1) > 0) {  // 从管道的读端读数据write(STDOUT_FILENO, &buf, 1);  // 将读到的数据输出到标准输出}write(STDOUT_FILENO, "\n", 1);close(pipefd[0]);  // 关闭管道的读端_exit(EXIT_SUCCESS);} else {            // 父进程close(pipefd[0]);  // 关闭管道的读端write(pipefd[1], "Hello, world!", 13);  // 向管道的写端写数据close(pipefd[1]);  // 关闭管道的写端wait(NULL);        // 等待子进程结束exit(EXIT_SUCCESS);}
}
示例说明

在上面的例子中,首先使用pipe()函数创建了一个管道,并获取了管道的两个文件描述符。然后,使用fork()函数创建了一个子进程。在子进程中,关闭了管道的写端,然后从管道的读端读取数据,并将读到的数据输出到标准输出。在父进程中,关闭了管道的读端,然后向管道的写端写入数据,并等待子进程结束。最后,在父进程中关闭了管道的写端,并结束了整个程序。

需要注意的是,管道是一种半双工的通信方式,数据只能单向流动。在上述例子中,创建了一个管道,并使用fork()函数创建了一个子进程。然后,在父进程中向管道的写端写入数据,在子进程中从管道的读端读取数据。由于管道是单向的,所以需要使用两个文件描述符来实现父子进程之间的双向通信。

总结

管道的主要特点和注意事项包括:

  • 管道中的数据是以字节流的形式传输的,不保留消息边界。
  • 管道的读写操作遵循先进先出(FIFO)的原则。
  • 管道的读端和写端都是独立的文件描述符,可以被不同的进程拥有。
  • 如果没有进程在读取管道中的数据,那么写入管道的操作可能会阻塞,直到有进程开始读取。
  • 当所有引用管道的进程都关闭了它们的文件描述符时,管道将被删除。

相关文章:

进程间通讯-管道

介绍 管道&#xff08;Pipe&#xff09;是操作系统提供的一种进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;机制&#xff0c;它允许一个进程的输出直接作为另一个进程的输入。管道主要分为以下两种类型&#xff1a; 无名管道&#xff08;Unn…...

项目总结-自主HTTP实现

终于是写完了&#xff0c;花费了2周时间&#xff0c;一点一点看&#xff0c;还没有扩展&#xff0c;但是基本功能是已经实现了。利用的是Tcp为网络链接&#xff0c;在其上面又写了http的壳。没有使用epoll&#xff0c;多路转接难度比较高&#xff0c;以后有机会再写&#xff0c…...

Java语言+二维数组+非递归实现五子棋游戏

以前做过一个C语言版五子棋&#xff1a;&#xff23;语言&#xff0b;二维数组&#xff0b;非递归实现五子棋游戏 现在做一个Java语言版五子棋&#xff0c;规则如下&#xff1a; 1&#xff64;白子为O; 2&#xff64;黑子为&#xff1b; 3&#xff64;白子先手&#xff1b;…...

WordCloud—— 词云

【说明】文章内容来自《机器学习入门——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 wordcloud 是python的第三方库&#xff0c;称为词云&#xff0c;也成文字云&#xff0c;可以根据文本中的词频以直观和艺术化的形式展示文本中词语的重要性。 依赖于pillow …...

linux网络----UDP编程

一、函数接口: 1.socket:创建一个用来网络通信的终端节点&#xff1b; 参数: type&#xff1a;套接字类型 SOCK_STREAM 流式套接字 TCP SOCK_DGRAM 数据报套接字 UDP SOCK_RAM 原始套接字 domain: 协议族 AF_INET protocal: 默认为0 2.s…...

[AI工具推荐]AiRestful智能API代码生成

智能API代码示例生成工具AiRestful 一、产品介绍二、如何使用1、第一步(必须):2、第二步(可选):3、第三步(智能生成): 三、如何集成到您的网站(应用)1、开始接入2、接入案例 四、注意点 一、产品介绍 AiRestful是一款基于智能AI的,帮助小白快速生成任意编程语言的API接口调用示…...

Elasticsearch 8.10.0同义词API用法详解,支持同义词热更新

Elasticsearch 的同义词功能非常强大,如果使用得当,可以显着提高搜索引擎的效果。使用同义词功能时的一个常见问题是更新同义词集。 同义词在搜索引擎领域用途 同义词在搜索引擎领域的用途可概括如下: 增强搜索的准确性——当用户输入一个关键词时,可能与他们实际意图相关…...

深度学习之模型权重

在深度学习中&#xff0c;模型的权重&#xff08;weights&#xff09;是指神经网络中的参数&#xff0c;这些参数用于调整和学习模型的行为&#xff0c;以便能够对输入数据进行有效的映射和提取有用的特征。深度学习模型通常由许多神经元和连接组成&#xff0c;而权重就是连接这…...

纯前端使用XLSX导出excel表格

1 单个sheet page.js(页面中的导出方法) import { exportExcel } from ../../../utils/exportExcel.js; leadOut() {const arr [{ id: 1, name: 张三, age: 14, sex: 男 },{ id: 2, name: 李四, age: 15, sex: 女 },{ id: 3, name: 王五, age: 16, sex: 男 },];const allR…...

将mjpg格式数转化成opencv Mat格式

该博客可以解决如下两个问题&#xff1a; 1、将mjpg格式数据转化成opencv Mat格式 2、v4l2_buffer 格式获取的mjpg格式数据转换成Mat格式。 要将 MJPEG 格式的数据转换为 OpenCV 的 Mat 格式&#xff0c;您可以使用 imdecode 函数。imdecode 函数可以将图像数据解码为 Mat 对象…...

【golang/g3n】3D游戏引擎G3N的windows安装与测试

目录 说在前面安装测试 说在前面 操作系统&#xff1a;win 11go version&#xff1a;go1.21.5 windows/amd64g3n版本&#xff1a;github.com/g3n/engine v0.2.0其他&#xff1a;找了下golang 3d相关的库&#xff0c;目前好像就这个比较活跃 安装 按照官方教程所说&#xff0c;…...

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass...

介绍一些操作系统—— Ubuntu 系统

介绍一些操作系统—— Ubuntu 系统 Ubuntu 系统 Ubuntu 是一个以桌面应用为主的 Linux 发行版操作系统&#xff0c;其名称来自非洲南部祖鲁语或豪萨语的“ubuntu"一词&#xff0c;意思是“人性”“我的存在是因为大家的存在"&#xff0c;是非洲传统的一种价值观。U…...

React中props 和 state异同初探

在 React 中&#xff0c;props 和 state 是两个非常重要的概念&#xff0c;它们决定了组件的行为和渲染方式。 Props props&#xff08;属性&#xff09;是父组件传递给子组件的数据。它们类似于函数的参数&#xff0c;可以在组件内部被访问和使用&#xff0c;但不能被修改。…...

spring-kakfa依赖管理之org/springframework/kafka/listener/CommonErrorHandler错误

问题&#xff1a; 整个项目使用spring-boot2.6.8版本&#xff0c;使用gradle构建&#xff0c;在common模块指定了implementation org.springframework.kafka:spring-kafka:2.6.8’这个工程也都能运行&#xff08;这正常发送kafka消息和接收消息&#xff09;&#xff0c;但是执行…...

基于go语言开发的海量用户及时通讯系统

文章目录 二十三、海量用户即时通讯系统1、项目开发前技术准备2.实现功能-显示客户端登录菜单3.实现功能-完成用户登录-1.完成客户端可以该长度值发送消息长度&#xff0c;服务器端可以正常接收到-2.完成客户端可以发送消息&#xff0c;服务器端可以接收到消息并根据客户端发送…...

19.Oracle 中count(1) 、count(*) 和count(列名) 函数的区别

count(1) and count(字段) 两者的主要区别是 count(1) 会统计表中的所有的记录数&#xff0c;包含字段为null 的记录。count(字段) 会统计该字段在表中出现的次数&#xff0c;忽略字段为null 的情况。 即不统计字段为null 的记录。 count(*) 和 count(1)和count(列名)区别 …...

C 库函数 - time()

描述 C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch&#xff08;1970-01-01 00:00:00 UTC&#xff09;起经过的时间&#xff0c;以秒为单位。如果 seconds 不为空&#xff0c;则返回值也存储在变量 seconds 中。 声明 下面是 time() 函数的声明。 time_t time(t…...

基于Python数据可视化的网易云音乐歌单分析系统

目录 《Python数据分析初探》项目报告 基于Python数据可视化的网易云音乐歌单分析系统一、项目简介&#xff08;一&#xff09;项目背景&#xff08;二&#xff09;项目过程 二、项目设计流程图&#xff08;一&#xff09;基于Python数据可视化的网易云音乐歌单分析系统的整体…...

Jenkins----基于 CentOS 或 Docker 安装部署Jenkins并完成基础配置

查看原文 文章目录 基于 CentOS7 系统部署 Jenkins 环境基于 Docker 安装部署 Jenkins环境配置 Jenkins 中文模式配置用户名密码形式的 Jenkins 凭据配置 ssh 私钥形式的 Jenkins 凭据配置 Jenkins 执行任务的节点 基于 CentOS7 系统部署 Jenkins 环境 &#xff08;1&#xff…...

flume系列之:监控flume agent channel的填充百分比

flume系列之:监控flume agent channel的填充百分比 一、监控效果二、获取flume agent三、飞书告警四、获取每个flume agent channel的填充百分比一、监控效果 二、获取flume agent def getKafkaFlumeAgent():# 腾讯云10.130.112.60zk = KazooClient(hosts...

信息安全和网络安全的区别

信息安全与网络安全都属于安全领域&#xff0c;但它们的范围和重点不同。 信息安全主要关注数据的保护&#xff0c;包括对敏感数据进行加密、防止数据丢失或泄露等措施。信息安全通常与数据存储、传输和处理相关。 而网络安全更侧重于保护计算机系统和网络免受攻击、病毒、蠕…...

【开源项目】WPF 扩展 -- 多画面视频渲染组件

目录 1、项目介绍 2、组件集成 2.1 下载地址 2.2 添加依赖 3、使用示例 3.1 启动动画 3.2 视频渲染 3.3 效果展示 4、项目地址 1、项目介绍 Com.Gitusme.Net.Extensiones.Wpf 是一款 Wpf 扩展组件。基于.Net Core 3.1 开发&#xff0c;当前是第一个发布版本 1.0.0&am…...

risc-v system instruction

ECALL ecall 指令以前叫做 scall&#xff0c;用于执行环境的变更&#xff0c;它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说&#xff0c;ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实…...

08 v-text指令

概述 v-text指令主要是用来渲染文本内容&#xff0c;和双大括号的效果基本一致&#xff0c;所以使用场景非常少。 一般情况下&#xff0c;我们都会使用双大括号语法去渲染文本内容&#xff0c;而不是使用v-text指令。 基本用法 我们创建src/components/Demo08.vue&#xff…...

vite基本知识

vite的了解与使用 基本知识 开发时&#xff0c;并不对代码打包&#xff0c;而实直接采用ESM的方式运行项目一 项目部署时&#xff0c;再对项目进行打包 核心原理 其核心原理是利用浏览器现在已经支持ES6的import&#xff0c;碰见import就会发送一个HTTP请求去加载文件 使…...

考研真题c语言

【2016年山西大学考研真题】输入10个学生三门课的成绩&#xff0c;用函数实现&#xff1a;找出最高的分数所对应的学号和成绩。 1. 定义一个结构体 Student 来表示每个学生&#xff0c;包括学号和三门课的成绩。 c typedef struct { int studentID; int score1; i…...

neuq-acm预备队训练week 9 P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景 抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 题目限制 题目描述 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF…...

【BIG_FG_CSDN】*VMware17pro*Linux*Redhit6网络管理(个人向——学习笔记)

物理机中的网络 查看物理网络的方法 “网络连接”—>单点选中网络的选项-->菜单栏中“查看此连接状态”-->“详细信息” “网络连接”中的VM网卡 在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡&#xff0c;它们分别…...

Nginx location+Nginx rewrite(重写)(新版)

Nginx locationNginx rewrite(重写) Nginx locationNginx rewrite(重写)一、location1、常用的Nginx 正则表达式2、location的类型3、location 的匹配规则4、location 优先级5、location 示例说明5.1只修改网页路径5.2修改nginx配置文件和网页路径5.3一般前缀5.4正则匹配5.5前缀…...

男女做暧昧小视频网站/公司网站开发费用

英文名称&#xff1a;TCO-PEG3-FITC 中文名称&#xff1a;反式环辛烯-三聚乙二醇-荧光素 分子式&#xff1a;C38H43N3O10S 分子量&#xff1a;733.83 纯度 gt;95% 外观&#xff1a;黄色固体 储存条件&#xff1a;-20C&#xff0c;避光避湿 用途&#xff1a;仅供科研使用…...

系统开发工具有哪些/北京seo招聘

有符号数的表示法&#xff0c;机器数(出现在电脑的二进位数值)有3个特点&#xff0c; 无符号或符号转换成数值来表示&#xff0c;没有 10101这样的资料&#xff0c;而是以010101来表示。 (推荐学习&#xff1a;phpstorm)只表示单纯的整数或小数&#xff0c;小数点的位置预设在一…...

专业网站制作咨询/长沙百度首页排名

请求[request] 如果请求 status 是pending&#xff0c;说明你get或者post用反了 GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号) Accept: /(客户端能接收的资源类型) Accept-Language: en-us(客户端接收的语言类型) Connection: Ke…...

加大网站建设力度/湖南百度推广代理商

1.客户端和服务器的区别(1)硬件和操作系统不同。(2)TCP/IP的功能相同&#xff0c;但是用法不同&#xff0c;客户端用来发起连接&#xff0c;而服务器端要等待连接。即应用程序调用Socket库的程序组件不同。(3)服务器程序可以同时和多台客户端计算机进行通信。(4)虽然有很多不同…...

wordpress系统付费/软文代写平台

Unity 3D 是目前主流的游戏开发引擎&#xff0c;有数据显示&#xff0c;全球最赚钱的 1000 款手机游戏中&#xff0c;有 30% 是使用 Unity 3D 开发出来的。尤其在 VR 设备中&#xff0c;Unity 3D 游戏开发引擎具有统治地位。 Unity 3D 能够创建实时、可视化的 2D 和 3D 动画、…...

南宁网站建设专家/免费站推广网站2022

jQuery on()方法是官方推荐的绑定事件的一个方法。使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件&#xff0c;通过本文给大家介绍jQuery on()绑定动态元素出现的问题小结&#xff0c;需要的朋友参考下jQuery on()方法是官方推荐的绑定事件的一个方法。使用 on() 方…...