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;
}

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

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

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

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

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

相关文章

超分子水凝胶与细胞的互动:现状、难题与未来蓝图

大家好&#xff01;今天来了解超分子水凝胶文章——《Using Chemistry To Recreate the Complexity of the Extracellular Matrix: Guidelines for Supramolecular Hydrogel–Cell Interactions》发表于《Journal of the American Chemical Society》。在再生医学的舞台上&…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法&#xff0c;其基本原理是通过一系列的简单决策&#xff0c;将数据集划分为多个子集&#xff0c;从而实现分类。决策树的核心思想是通过树形结构表示决策过程&#xff0c;节点代表特征&#xff0c;边代表决策&#xff0c;叶子…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

一文详解精细化工行业持续增长的策略与路径解析

随着全球经济的快速发展和科技的不断进步&#xff0c;精细化工行业正面临着前所未有的挑战和机遇。在这个过程中&#xff0c;数字化转型已成为推动行业持续增长的关键因素。精细化工行业&#xff0c;作为化学工业的一个重要分支&#xff0c;其产品广泛应用于医药、农药、涂料、…

医疗器械设备语音ic芯片方案-选型大全

在医疗设备领域&#xff0c;深圳唯创知音提供了多款适用的语音IC产品&#xff0c;以下是其中几款较为常见的推荐&#xff1a; 一、WT588F02X-8S 特点&#xff1a; 1&#xff1a;低成本人机交互语音方案&#xff0c;仅需嵌入在产品中&#xff0c;提升医疗设备智能化水平。 2&…

微服务实战系列之玩转Docker(十七)

导览 前言Q&#xff1a;如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码&#xff0c;智慧工地全套源代码包含&#xff1a;PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线&#xff0c;以AI、物联网、BIM技术为手段&#xff0c;对施工现场进行立体化、全方位、全时段管理&#xff0c;实现规范施工管…

Python 从入门到实战43(Pandas数据结构)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们学习了NumPy数组操作的相关基础知识。今天学习一下pa…

数字信号处理Python示例(1)使用Python生成正弦信号

文章目录 前言一、连续时间周期信号二、正弦波三、使用Python生成正弦信号的步骤内置库说明 四、完整的python代码与运行结果1.完整的python代码2、运行结果 五、总结 前言 介绍如何使用python生成正弦信号&#xff0c;给出详细步骤和完整的python代码和运行结果。 一、连续时…

树叶分类竞赛(Baseline)以及kaggle的GPU使用

树叶分类竞赛(Baseline)-kaggle的GPU使用 文章目录 树叶分类竞赛(Baseline)-kaggle的GPU使用竞赛的步骤代码实现创建自定义dataset定义data_loader模型定义超参数训练模型预测和保存结果 kaggle使用 竞赛的步骤 本文来自于Neko Kiku提供的Baseline&#xff0c;感谢大佬提供代码…

四足机器人实战篇之二十二:四足机器人支撑腿反作用力规划之反馈控制及线性约束条件优化方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、先使用反馈+前馈的控制方式,根据躯干期望的位置速度,计算出当前身体姿态的虚拟反作用力(实现躯体平衡控制器)二、再建立线性约束的凸优化问…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成&#xff08;1&#xff09;数据分层&#xff08;2&#xff09;数据构成 四、数据存储五、数据建模和数据模型&#xff08;1&#xff09;数据建模&#xff08;2&#xff09;数据模型 六、总结 在企业物流管理中&…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

centos7 安装python3.9.4,解决import ssl异常

本篇文章介绍如何在centos7中安装python3.9.4(下文简称python3)&#xff0c;解决python3安装后import ssl模块失败问题&#xff0c;为什么我要在centos7中安装python呢&#xff0c;因为我需要在服务器中跑python数据处理脚本。 安装python3同时解决import ssl模块失败问题总共包…

【分布式技术】分布式序列算法Snowflake深入解读

文章目录 概述Snowflake算法的构成&#xff1a;Snowflake算法的特点&#xff1a;Snowflake算法存在的问题&#xff1a; &#x1f50d; 雪片算法在分布式系统中是如何保证ID的唯一性和有序性的&#xff1f;唯一性&#xff08;Uniqueness&#xff09;有序性&#xff08;Orderline…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门&#xff1a;纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色&#xff0c;其作用可以归纳为以下几个方面&#xff1a; 视觉吸引与装饰 增强视觉吸引力&#xff1a;丝带效果以其独特的形态和色彩&#xff0c;能够迅速吸引用户的注意力&…

TP41Y阀套式排污阀

在现代工业领域中&#xff0c;阀门作为一种关键的控制元件&#xff0c;广泛应用于各种流体系统中。其中&#xff0c;TP41Y阀套式排污阀以其独特的设计和优异的性能&#xff0c;在石油、天然气、化工等行业中占据了重要的地位。本文将对TP41Y阀套式排污阀进行详细的专业解析&…

Python | Leetcode Python题解之第522题最长特殊序列II

题目&#xff1a; 题解&#xff1a; class Solution:def findLUSlength(self, strs: List[str]) -> int:def is_subseq(s: str, t: str) -> bool:pt_s pt_t 0while pt_s < len(s) and pt_t < len(t):if s[pt_s] t[pt_t]:pt_s 1pt_t 1return pt_s len(s)ans …

Flink SQL中Changelog事件乱序处理原理

本文围绕Flink SQL实时数据处理中的Changelog事件乱序问题&#xff0c;分析了Flink SQL中Changelog事件乱序问题的原因&#xff0c;并提供了解决方案以及处理Changelog事件乱序的建议。以帮助您更好地理解Changelog的概念和应用&#xff0c;更加高效地使用Flink SQL进行实时数据…