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

匿名管道详解

进程间通讯的目的

  • 数据传输:一个进程需要把它的数据发送给另一个数据
  • 资源共享:多个进程需要共享同样的资源
  • 通知事件:一个进程需要向另一个或者一组进程发送消息,通知它发生了某种事件(如进程终止时要通知父进程)
  • 进程控制:有些进程希望控制另一个进程的执行,此时控制进程希望可以拦截另一个进程所有陷入和异常,并能及时知道它的状态改变

简而言之,就是需要多个进程协同共同完成一些事情 

进程通讯的方式

  • 匿名管道,命名管道
  • System V IPC 消息队列,共享内存,信号量
  • POSIX IPC 消息队列,共享内存,信号量,互斥量,条件变量,读写锁

匿名管道

pipe函数创建一无名管道

参数:fd文件描述符,其中fd[0]表示读端,fd[1]表示写端 

返回值:成功返回0,失败返回返回错误代码

pipe创建的是内存级的文件,匿名文件(管道),匿名管道只能进行血缘关系进程通讯。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>int main()
{int fds[2];int n = pipe(fds);char buffer[1024];if(n<0)//返回值小于0,创建失败{perror("pipe error!\n");exit(1);}//fork创建子进程,可以继承父进程的PCBpid_t pid = fork();if(pid==0)//子进程{close(fds[1]);//关闭写端while(1){size_t size = read(fds[0],buffer,sizeof(buffer)-1);if(size<=0){printf("子进程读取退出\n");exit(1);}buffer[size] = 0;printf("子进程读取到:%s",buffer);memset(buffer,0,sizeof(buffer));}}//父进程关闭读端close(fds[0]);while(fgets(buffer,sizeof(buffer),stdin)){size_t len = strlen(buffer);if(len<=0){continue;}size_t size = write(fds[1],buffer,len);if(size!=len){perror("write error, exit!\n");exit(2);}else{printf("父进程写端写入:%s",buffer);}memset(buffer,0,sizeof(buffer));}return 0;
}

匿名管道的4种情况

  1. 管道内部没有数据,写端不关闭自己的写端文件符fd,读端就要阻塞等待
  2. 管道内部被写满,读端不关闭自己的读端文件符fd,写端就要阻塞等待
  3. 对于写端而言,关闭写端文件符wfd,读端就会把pipe中数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件结尾
  4. 对于读端而言,关闭读端文件符rfd,写端再写,操作系统就会给写端进程发送信号SIGPIPE,写端进程收到信号,默认动作中止进程。(linux信号详解)

4个注意点 

  1. 匿名管道只能用于父子进程通讯
  2. pipe是面向字节流的
  3. 父子进程退出,管道自动释放,文件的生命周期是随进程的
  4. 管道只能单向通讯 

其实匿名管道在内核中是下面这样: 

相关文章:

匿名管道详解

进程间通讯的目的 数据传输&#xff1a;一个进程需要把它的数据发送给另一个数据资源共享&#xff1a;多个进程需要共享同样的资源通知事件&#xff1a;一个进程需要向另一个或者一组进程发送消息&#xff0c;通知它发生了某种事件&#xff08;如进程终止时要通知父进程&#…...

深度解读MySQL意向锁的工作原理机制与应用场景

意向锁 意向锁的概念 意向锁是InnoDB自动添加的一种锁&#xff0c;不需要用户去干预。 是数据库中的一种表级锁&#xff0c;一个事务要给一个资源加锁时&#xff0c;必须要先获取到对应类型的意向锁之后&#xff0c;才可以给这个资源加上自己想要的共享锁或者排他锁&#xff0…...

ZYNQ TCP 协议的远程更新 QSPI Flash

1 SDK直接少些Flash过程 ****** Xilinx Program Flash ****** Program Flash v2019.1 (64-bit)**** SW Build 2552052 on Fri May 24 14:49:42 MDT 2019** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.WARNING: Failed to connect to hw_server at TCP:127.0.0.1:3…...

告别繁琐粘贴,CleanClip Mac 版,让复制粘贴变得简单快捷!粘贴队列功能太强大了!

告别繁琐粘贴&#xff0c;CleanClip Mac 版&#xff0c;让复制粘贴变得简单快捷&#xff01; CleanClip for Mac &#x1f4cb; 是一款专为Mac用户设计的高效剪贴板管理工具。它解决了传统复制粘贴过程中的繁琐问题&#xff0c;让你的工作流程更加顺畅和高效。 &#x1f504;…...

前端基础知识(HTML+CSS+JavaScript)

文章目录 一、HTML1.1 HTML 基础&#xff1a;1.1.1 HTML 的概念&#xff1a;1.1.2 认识 HTML 标签&#xff1a;1.1.3 HTML 文件基本结构&#xff1a;1.1.4 标签层次结构&#xff1a; 1.2 HTML 快速入门&#xff1a;1.3 HTML常见标签&#xff1a;1.3.1 标题标签&#xff1a;h1-h…...

算力服务器和GPU服务器的区别是什么?

随着互联网科技的快速发展&#xff0c;服务器的类型也变得多种多样了&#xff0c;今天小编就来为大家介绍一下算力服务器和GPU服务器还有他们之间的区别是什么&#xff1f; 算力服务器通常是指具有着较高计算能力的服务器&#xff0c;算力服务器一般都是用于处理大量的计算任务…...

获取Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…...

软考架构-层次架构风格

一、两层C/S架构 客户端和服务器都有处理功能。处理在表示层&#xff08;客户端&#xff09;和数据层&#xff08;服务器&#xff09;进行 二、三层C/S架构 将处理功能独立出来。表示层在客户机上&#xff0c;功能层在应用服务器上&#xff0c;数据层在数据库服务器上。 三…...

Unity射击游戏开发教程:(35)轰炸敌人

现在敌人和飞机已经慢慢地越来越有各自地地行为了,在本文中,我们将介绍如何创建一个具有以下行为的敌人: 飞机会来回弹跳。飞机将有 4 架无人机轰炸机围绕飞机旋转。无人机轰炸机会偶尔投下沿着屏幕传播的炸弹。如果炸弹击中玩家或在随机时间后就会爆炸。如果炸弹没有击中玩…...

【网络】高级IO——select版本TCP服务器

目录 前言 一&#xff0c;select函数 1.1.参数一&#xff1a;nfds 1.2.参数二&#xff1a; readfds, writefds, exceptfds 1.2.1.fd_set类型和相关操作宏 1.2.2.readfds, writefds, exceptfds 1.2.3.怎么理解 readfds, writefds, exceptfds是输入输出型参数 1.3.参数三…...

【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

一. 命名空间 1. 定义 出现的意义&#xff1a;解决各种函数、关键词和类的名称冲突问题。 定义方式&#xff1a;namespace 命名空间的名字 { } &#xff08;注意&#xff01;}后面不加&#xff1b;&#xff09; namespace 是关键词命名空间的…...

uniapp自定义导航栏以及页面加背景

如果想给uniapp的页面加背景图片的话&#xff0c;疯狂度了之后会发现uniapp中背景图片用本地图片不起效果&#xff0c;所以一般用网络路径&#xff0c;之后又会发现&#xff0c;页面如果直接加背景的话有可能会遇到页面内容不够&#xff0c;背景撑不满整个页面&#xff0c;如果…...

MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法

如图&#xff0c;MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式下&#xff0c;光标下方永远会出现一个CapsLock箭头Icon。此Icon挡住视野&#xff0c;还容易误触导致切换大小写状态&#xff0c;带来的收益远远小于带来的困扰。 解决办法 打开终端&#xff0c;输入以下…...

C#基础(10)变长参数和参数默认值

前言 作为函数的补充知识点&#xff0c;我们已经学习了ref和out&#xff0c;接下来两节我们继续来讲函数相关的内容。本节则讲解变长参数和参数默认值。 函数语法 关键字&#xff1a;params public void PrintNumbers(params int[] numbers) {for 相关逻辑 } 注意 params…...

Vue转React开发经验分享——hooks写法如何触发react生命周期、如何触发数据更新?

背景&#xff1a;习惯了vue的写法&#xff0c;并且vue2和vue3都比较熟悉&#xff0c;在转react开发中&#xff0c;不停的思考react和vue框架的相似之处&#xff0c;以及vue中的写法在react里怎么替换。本文将组件更新或组件生命周期角度出发聊聊如何使用hooks触发生命周期&…...

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…...

element-plus的面包屑组件el-breadcrumb

面包屑组件主要用来显示当页面路径&#xff0c;以及快速返回之前的页面。 涉及2个组件 el-breadcrumb 和el-breadcrumb-item, el-breadcrumb的spearator指定item的分隔符 el-breadcrumb-item的to和replace属性和vue-router的一致&#xff0c;需要结合vue_router一起使用 用法…...

推荐几个网盘资源站给大伙,找资源更方便

夸克网盘在当前已然成为极为主流的网盘之一&#xff0c;其功能体验堪称强大&#xff0c;不仅支持在线解压阅读&#xff0c;磁力离线等功能也十分出色。那么&#xff0c;究竟该如何寻找夸克资源呢&#xff1f;下面&#xff0c;我就来为大家分享几个堪称神级的夸克资源网站。 一、…...

【Qt】Qml界面中嵌入C++ Widget窗口

1. 目的 qml做出的界面漂亮&#xff0c;但是执行效率低&#xff0c;一直想找一个方法实现qml中嵌入c界面。现在从网上找到一个方法&#xff0c;简单试了一下貌似可行&#xff0c;分享一下。 2. 显示效果 3. 代码 3.1 工程结构 3.2 pro文件 需要添加widgets > QT quick …...

Python快速入门 —— 第五节:接口开发

第五节:接口开发 目标: 学习使用Flask框架开发简单的Web接口,实现对学生信息的增删改查,通过HTTP请求与应用交互。 内容: Flask简介: Flask是一个轻量级的Python Web框架,使用简单,扩展性强,适合快速开发Web应用。安装Flask: pip install flask创建Flask应用: fr…...

​链表题解——回文链表【LeetCode】

算法思路 核心思想&#xff1a; 找到链表的中间节点。反转链表的后半部分。比较链表的前半部分和反转后的后半部分&#xff0c;如果值完全一致&#xff0c;则是回文链表。 具体步骤&#xff1a; 使用快慢指针找到链表的中间节点&#xff08;middleNode 方法&#xff09;。反转…...

Axios学习笔记

Axios简介 axios前端异步请求库类似JQuery ajax技术&#xff0c; ajax用来在页面发起异步请求到后端服务&#xff0c;并将后端服务响应数据渲染到页面上&#xff0c; jquery推荐ajax技术&#xff0c;但vue里面并不推荐在使用jquery框架&#xff0c;vue推荐使用axios异步请求库。…...

Nuxt.js 布局系统详解:构建可复用页面框架

Nuxt.js 是一个基于 Vue.js 的强大框架&#xff0c;旨在简化开发流程并提高项目的可维护性。布局系统是 Nuxt.js 项目结构中的一个重要组成部分&#xff0c;它位于 layouts 目录下&#xff0c;帮助开发者实现页面间的统一风格和结构复用。 什么是 Nuxt.js 布局系统 Nuxt.js 提…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…...

Sentry 接口返回 Status Code 429 Too Many Requests

Sentry 是一个 开源的错误追踪&#xff08;Error Tracking&#xff09;平台&#xff0c;主要用于实时捕获和监控应用程序中的异常、错误日志&#xff0c;并帮助开发者快速定位问题根源。 &#x1f4cc; Sentry 的核心功能 自动捕获异常 自动捕捉 JavaScript、Vue、React、Node.…...

.net webapi http参数自定义绑定模型

.NET Web API 中 HTTP 参数自定义绑定模型的深度解析 在 .NET Web API 开发里&#xff0c;常规的参数绑定往往能满足大部分需求。不过&#xff0c;当遇到一些特殊情况时&#xff0c;就需要自定义将 HTTP 参数绑定到 action 特定模型参数了。接下来&#xff0c;我们就深入探讨如…...

Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理

Fullstack 面试复习笔记&#xff1a;Spring / Spring Boot / Spring Data / Security 整理 之前的笔记&#xff1a; Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记&#xff1a;Java 基础语法 / 核心特性体系化总结Fullsta…...

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…...

Kafka 消息模式实战:从简单队列到流处理(二)

四、Kafka 流处理实战 4.1 Kafka Streams 简介 Kafka Streams 是 Kafka 提供的流处理库&#xff0c;它为开发者提供了一套简洁而强大的 API&#xff0c;用于构建实时流处理应用程序。Kafka Streams 基于 Kafka 的高吞吐量、分布式和容错特性&#xff0c;能够处理大规模的实时…...

Protobuf 中的类型查找规则

a.proto syntax "proto2"; //protoc3生成代码兼容proto2语法 package pkgA; message Example { }ba.proto package pkgB.pkgA; message Example { }b.proto syntax "proto3"; //protoc3生成代码兼容proto2语法 package pkgB; import "test1/a.pr…...