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

Webserver(2.6)有名管道

目录

  • 有名管道
  • 有名管道使用
  • 有名管道的注意事项
  • 读写特性
  • 有名管道实现简单版聊天功能
    • 拓展:如何解决聊天过程的阻塞

有名管道

可以用在没有关系的进程之间,进行通信

有名管道使用

  • 通过命令创建有名管道
    mkfifo 名字
    在这里插入图片描述

  • 通过函数创建有名管道
    int mkfifo

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>int main(){int ret=mkfifo("fifo1",0664);if(ret==-1){perror("mkfifo");exit(0);}return 0;
}

write.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>//向管道中写数据
int main(){//1.判断文件是否存在int ret=access("test",F_OK);if(ret==-1){printf("管道不存在,创建管道\n");//2.创建管道文件ret=mkfifo("test",0664);if(ret==-1){perror("mkfifo");exit(0);}   }//3.打开管道int fd=open("test",O_WRONLY);if(fd==-1){perror("open");exit(0);}//写数据for(int i=0;i<100;i++){char buf[1024];sprintf(buf,"hello,%d\n",i);printf("write data:%s\n",buf);write(fd,buf,strlen(buf));sleep(1);}close(fd);return 0;
}

读端read.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>//向管道中写数据
int main(){//1.打开管道文件int fd=open("test",O_RDONLY);if(fd==-1){perror("open");exit(0);}//读数据while(1){char buf[1024]={0};int len=read(fd,buf,sizeof(buf));if(len==0){printf("写端断开连接了..\n");break;}printf("recv buf:%s\n",buf);}close(fd);return 0;
}

在这里插入图片描述
读端和写端一起打开,才能写出数据
在这里插入图片描述
在这里插入图片描述

写端暂停之后,也读取不到了,就退出程序了
在这里插入图片描述在这里插入图片描述

如果先关闭读端,写端也立马终止程序了
读端关闭了,还在写数据,会产生信号,因为没有读端了还写数据,管道会破裂,所以产生信号立马终止。
在这里插入图片描述

有名管道的注意事项

1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道
2.一个为只写而打开一个管道的进程会阻塞,直到另一个进程为只读打开管道(与上一个相对)

读写特性

读管道:
管道中有数据,read返回实际读到的字节数
管道中无数据,管道写端被全部关闭,read返回0(相当于读到文件末尾)
写端没有全部被关闭,read阻塞等待

写管道:
管道读端被全部关闭,进程会异常终止,进程会收到sigpipe信号。
管道读端没有被全部关闭,管道已经满了,write会阻塞,管道未满,write将数据写入,并返回实际写入的字节数

有名管道实现简单版聊天功能

如何实现互发呢?
创建两个管道,一个从A到B,一个从B到A
chatA

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>int main(){//1.判断有名管道文件是否存在int ret=access("fifo1",F_OK);if(ret==-1){//文件不存在printf("管道不存在,创建对应的有名管道\n");ret=mkfifo("fifo1",0664);if(ret==-1){perror("mkfifo");exit(0);}}ret=access("fifo2",F_OK);if(ret==-1){//文件不存在printf("管道不存在,创建对应的有名管道\n");ret=mkfifo("fifo2",0664);if(ret==-1){perror("mkfifo");exit(0);}}//2.以只写的方式打开管道fifo1int fdw=open("fifo1",O_WRONLY);if(fdw==-1){perror("open");exit(0);}printf("打开管道fifo1成功,等待写入...\n");//3.以只读的方式打开管道fifo2int fdr=open("fifo2",O_RDONLY);if(fdr==-1){perror("open");exit(0);}printf("打开管道fifo2成功,等待读取...\n");char buf[128];//4.循环的写读数据while(1){memset(buf,0,128);//获取标准输入的数据fgets(buf,128,stdin);//写数据ret=write(fdw,buf,strlen(buf));if(ret==-1){perror("write");exit(0);}//5.读管道数据memset(buf,0,128);ret=read(fdr,buf,128);if(ret<=0){perror("read");break;}printf("buf:%s\n",buf);}//6.关闭文件描述符close(fdr);close(fdw);return 0;
}

chatB

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>int main(){//1.判断有名管道文件是否存在int ret=access("fifo1",F_OK);if(ret==-1){//文件不存在printf("管道不存在,创建对应的有名管道\n");ret=mkfifo("fifo1",0664);if(ret==-1){perror("mkfifo");exit(0);}}ret=access("fifo2",F_OK);if(ret==-1){//文件不存在printf("管道不存在,创建对应的有名管道\n");ret=mkfifo("fifo2",0664);if(ret==-1){perror("mkfifo");exit(0);}}//2.以只读的方式打开管道fifo1int fdr=open("fifo1",O_RDONLY);if(fdr==-1){perror("open");exit(0);}printf("打开管道fifo1成功,等待读取...\n");//3.以只写的方式打开管道fifo2int fdw=open("fifo2",O_WRONLY);if(fdw==-1){perror("open");exit(0);}printf("打开管道fifo2成功,等待写入...\n");char buf[128];//4.循环的写读数据while(1){//5.读管道数据memset(buf,0,128);ret=read(fdr,buf,128);if(ret<=0){perror("read");break;}printf("buf:%s\n",buf);memset(buf,0,128);//获取标准输入的数据fgets(buf,128,stdin);//写数据ret=write(fdw,buf,strlen(buf));if(ret==-1){perror("write");exit(0);}}//6.关闭文件描述符close(fdr);close(fdw);return 0;
}

在这里插入图片描述
在这里插入图片描述

拓展:如何解决聊天过程的阻塞

读和写不能放到同一个文件中,因为必然会引起阻塞,每次写完都需要等待对方上一次读完才能发过去

相关文章:

Webserver(2.6)有名管道

目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展&#xff1a;如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间&#xff0c;进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …...

四足机器人实战篇之一:波士顿spot机器人工程实现分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、机器人发展历史二、硬件系统及电机执行器篇硬件系统电机执行器传感器机处理器电气连接三、感知(视觉点云、局部地图、定位)篇1.深度相机获取…...

TensorFlow 预训练目标检测模型集合

Tensorflow 提供了一系列在不同数据集上预训练的目标检测模型&#xff0c;包括 COCO 数据集、Kitti 数据集、Open Images 数据集、AVA v2.1 数据集、iNaturalist 物种检测数据集 和 Snapshot Serengeti 数据集。这些模型可以直接用于推理&#xff0c;特别是当你对这些数据集中已…...

字符串的区别

C 和 Java 字符串的区别 最近 C 和 Java 在同步学习&#xff0c;都有个字符串类型&#xff0c;但二者不太一样&#xff0c;于是就做了些许研究。 在编程中&#xff0c;字符串作为数据类型广泛应用于不同的场景。虽然 C 和 Java 都允许我们处理字符串&#xff0c;但它们在字符…...

EMR Serverless Spark:一站式全托管湖仓分析利器

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 李钰&#xff08;绝顶&#xff09; | 阿里云智能集团资深技术专家&#xff0c;阿里云 EMR 团队负责人 活动&#xff1a; 2024 云栖大会 AI - 开源大数据专场 数据平台技术演变 …...

Linux find 匹配文件内容

在Linux中&#xff0c;你可以使用find命令结合-exec或者-execgrep来查找匹配特定内容的文件。以下是一些示例&#xff1a; 查找当前目录及其子目录下所有文件内容中包含"exampleText"的文件&#xff1a; find . -type f -exec grep -l "exampleText" {} \…...

【Redis优化——如何优雅的设计key,优化BigKey,Pipeline批处理Key】

Redis优化——如何优雅的设计key&#xff0c;优化BigKey&#xff0c;Pipeline批处理Key 一、Key的设计1. 命名规范2. 长度限制在44字节以内 二、BigKey优化1. 查找bigkey2. 删除BigKey3. 优化BigKey 三、Pipeline批处理Key1. 单节点的Pipeline2. 集群下的Pipeline 一、Key的设计…...

数据结构与算法分析:你真的理解图算法吗——深度优先搜索(代码详解+万字长文)

一、前言 图是计算机科学中用来表示复杂结构信息的一种基本结构。本章我们会讨论一些通用的围表示法,以及一些频繁使用的图算法。本质上来说,一个图包含一个元素集合(也就是顶点),以及元素两两之间的关系(也就是边),由于应用范围所限,本章我们仅仅讨论简单图,简单围并不会如(a…...

LinkedList 分析

LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比&#xff0c;我们 Java 集合常见面试题总结(上)有详细介绍到。 双向链表 不过&#xff0c;我们在项目中一般是不会使用到 Link…...

【C/C++】模拟实现strlen

学习目标&#xff1a; 使用代码模拟实现strlen。 逻辑&#xff1a; strlen 需要输入一个字符串数组类型的变量&#xff0c;并且返回一个整型类型的数据。strlen 需要计算字符串数组有多少个元素。 代码1&#xff1a;使用计数器 #define _CRT_SECURE_NO_WARNINGS 1 #include&…...

mybatis从浅入深一步步演变分析

mybatis从浅入深一步步演变分析 版本一&#xff1a;不使用代理&#xff08;非spring&#xff09; package com.yimeng.domain;public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id…...

Java阶段三02

第3章-第2节 一、知识点 面向接口编程、什么是spring、什么是IOC、IOC的使用、依赖注入 二、目标 了解什么是spring 理解IOC的思想和使用 了解IOC的bean的生命周期 理解什么是依赖注入 三、内容分析 重点 了解什么是spring 理解IOC的思想 掌握IOC的使用 难点 理解IO…...

【Linux】掌握库的艺术:我的动静态库封装之旅

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1.什么是库1.2 认识动静态库1.2.1 动态库1.2.2…...

UE5动画控制 基础

素材 mixamo先去选择一个character 点击下载 就这个下载下来 然后选几个animation&#xff0c; 记得勾选 把动作下载了 without skin就是只要动作 然后把他们放在一个文件夹里先 UE里导入 找一个文件夹&#xff0c;直接拖拽进来那个character的fbx&#xff0c;默认配置就…...

流畅!HTMLCSS打造网格方块加载动画

效果演示 这个动画的效果是五个方块在网格中上下移动&#xff0c;模拟了一个连续的加载过程。每个方块的动画都是独立的&#xff0c;但是它们的时间间隔和路径被设计为相互协调&#xff0c;以创建出流畅的动画效果。 HTML <div class"loadingspinner"><…...

linux命令之top(Linux Command Top)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...

数据结构-希尔排序(ShellSort)笔记

看动画理解 【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 一 基本思想 先选定一个整数gap&#xff0c;把待排序文件中所有记录分成gap个组&#xff0c;所有距离为gap的记录分在同一组内&#xff0c;并对每一组内的元素进行排序。 然后将gap逐渐减小重复上…...

Junit + Mockito保姆级集成测试实践

一、做好单测&#xff0c;慢即是快 对于单元测试的看法&#xff0c;业界同仁理解多有不同&#xff0c;尤其是在业务变化快速的互联网行业&#xff0c;通常的问题主要有&#xff0c;必须要做吗&#xff1f;做到多少合适&#xff1f;现在没做不也挺好的吗&#xff1f;甚至一些大…...

软件项目管理要点

一.项目管理 1.盈亏平衡分析 销售额固定成本可变成本税费利润 当利润为0的时候就是盈亏平衡点。 2.范围管理 范围定义的输入包括&#xff1a;项目章程、项目范围管理计划、组织过程资产、批准的变更申请。 3.时间管理 项目时间管理中的过程包括活动定义、活动排序、活动的资…...

ESP8266 连接 MQTT 服务器EMQX 连接MQTTX

目录 1.先用有一台自己的云服务器 2. 使用FinalShell连接阿里云云服务器ECS 3.安装宝塔 4.在云服务器打开8888端口 5.使用外网面板地址打开宝塔面板 6.安装Docker 7.下载emqx 8.打开emqxWeb 界面 9.下载MQTTX 10.EMQX加一个客户端 11.开始通信 12.加入单片机ESP8266 …...

网易520发布会公布40余款游戏动态,新品精品化+AI应用成趋势

网易520发布会&#xff1a;多款新品游戏崭露头角5月20日&#xff0c;2026年『网易游戏520线上发布会』盛大举办&#xff0c;公布了40余款游戏及IP的最新动态。其中&#xff0c;《遗忘之海》官宣将于5月22日开启三测前瞻直播&#xff0c;并于28日正式开启测试。这款游戏出自《第…...

如何无限期使用Cursor AI编程助手:完整免费方案指南

如何无限期使用Cursor AI编程助手&#xff1a;完整免费方案指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial…...

8大网盘高速下载终极指南:免费实现全平台直链解析,告别限速烦恼

8大网盘高速下载终极指南&#xff1a;免费实现全平台直链解析&#xff0c;告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 /…...

从0到1:产品经理如何构建高效的产品管理体系

现如今&#xff0c;在数字化浪潮把全球都给席卷的这种状况之下&#xff0c;产品已然变成了企业竞争的核心载体。对于一个优秀的产品来讲&#xff0c;其背后通常是没办法离开一套科学且高效的产品管理体系的。产品管理&#xff0c;它作为连接用户需求、商业目标以及技术实现的枢…...

在Taotoken平台观测大模型API用量与成本的实际体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Taotoken平台观测大模型API用量与成本的实际体验 对于需要持续调用多个大模型API的开发者或团队而言&#xff0c;成本控制与预算…...

RA6M3 HMI开发板SDHI接口与SD卡存储性能深度测评

1. 项目概述&#xff1a;从一块开发板到人机交互界面的探索最近在做一个工业现场数据监控终端的原型&#xff0c;核心需求是在一块屏幕上实时显示传感器数据、设备状态&#xff0c;并且能通过触摸屏进行简单的参数设置。选型的时候&#xff0c;瑞萨电子的RA6M3 HMI Board进入了…...

【2024全球重大社会事件回溯实证】:Perplexity搜索结果偏差率对比测试(含Reuters、AP、路透中文网基准数据)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;【2024全球重大社会事件回溯实证】&#xff1a;Perplexity搜索结果偏差率对比测试&#xff08;含Reuters、AP、路透中文网基准数据&#xff09; 为量化AI驱动型搜索引擎在重大社会事件报道中的信息保真度&…...

链路层协议

链路层协议要解决哪些问题。有哪些二层网络&#xff0c;其链路层协议是什么 链路层&#xff08;数据链路层&#xff0c;OSI模型第二层&#xff09;的主要功能是在物理层提供的物理连接基础上&#xff0c;提供可靠的数据传输服务。它负责将原始的物理连接转化为无差错、有逻辑结…...

基于RT-Thread与STM32的机器人底盘驱动控制模型设计与实现

1. 项目概述与核心价值最近在做一个机器人底盘的项目&#xff0c;客户要求既要实时性高&#xff0c;又要能方便地调试和后期维护。一开始想着直接用裸机写个状态机&#xff0c;但考虑到后续要加传感器融合、路径规划这些复杂算法&#xff0c;裸机那套调度和资源管理就有点捉襟见…...

深入CAN总线时序测试:如何用PicoScope精准测量Tbit与Tmess(以CAN ID 0x380为例解析异常)

深入CAN总线时序测试&#xff1a;如何用PicoScope精准测量Tbit与Tmess&#xff08;以CAN ID 0x380为例解析异常&#xff09; 在汽车电子和工业控制领域&#xff0c;CAN总线的时序一致性测试是确保通信可靠性的关键环节。当工程师面对Tbit计算结果异常或特殊报文结构时&#xff…...