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

有名管道及其应用

创建FIFO文件

    1.通过命令: mkfifo + 文件名

    2.通过函数: mkfifo

    #include <sys/types.h>

    #include <sys/stat.h>

    int mkfifo(const char *pathname, mode_t mode);

    参数:

        -pathname:管道名称的路径

        -mode:文件的权限,和open的mode是一样的,是一个八进制的数

    返回值:

        成功返回0,失败返回-1,并设置错误号

有名管道的注意事项

    1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道

    2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道

    读管道:

        管道中有数据,read返回实际读到的字节数

        管道中无数据:

            管道写端被全部关闭,read返回0,(相当于读到文件末尾)

            写端没有被全部关闭,read阻塞等待

    写管道:

        管道读端被全部关闭,进程异常终止(收到一个SIGPIPE信号)

        管道读端没有全部关闭:

            管道已经满了,write会阻塞

            管道没有满,write将数据写入,并返回实际写入的字节数

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

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.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.以只写的方式打开管道1int fdw = open("fifo1", O_WRONLY);if(fdw == -1) {perror("open");exit(0);}printf("打开fifo1成功,等待写入数据...\n");//3.以只读的方式打开管道2int 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);}}//读管道数据while(1) {memset(buf, 0, 128);ret = read(fdr, buf, 128);if(ret <= 0) {perror("read");break;}printf("buf: %s\n", buf);}//5.关闭文件描述符close(fdw);close(fdr);return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.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.以只读的方式打开管道1int fdr = open("fifo1", O_RDONLY);if(fdr == -1) {perror("open");exit(0);}printf("打开fifo1成功,等待读取数据...\n");//3.以只写的方式打开管道2int fdw = open("fifo2", O_WRONLY);if(fdw == -1) {perror("open");exit(0);}printf("打开fifo2成功,等待写入数据...\n");char buf[128];//4.循环地读写数据//读管道数据while(1) {memset(buf, 0, 128);ret = read(fdr, buf, 128);if(ret <= 0) {perror("read");break;}printf("buf: %s\n", buf);}//往管道写数据while(1) {memset(buf, 0, 128);//获取标准输入的数据fgets(buf, 128, stdin);//写数据ret = write(fdw, buf, strlen(buf));if(ret == -1) {perror("write");exit(0);}}//5.关闭文件描述符close(fdw);close(fdr);return 0;
}

相关文章:

有名管道及其应用

创建FIFO文件 1.通过命令&#xff1a; mkfifo 文件名 2.通过函数: mkfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数&#xff1a; -pathname&#xff1a;管道名称的路径 -mode&#xff1a;文件的权限&a…...

加州大学伯克利分校 计算机科学专业

加州大学伯克利分校 计算机科学专业 cs 61a cs 61b cs61c...

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…...

程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库&#xff0c;这一举动虽然看似微小&#xff0c;但其中的快乐和意义却是无法用言语表达的。 Beego是一个开源的Go语言Web框架&#xff0c;它采用了MVC架构模式&#xff0c;并集成了很多常用的功能和中间件。小插件是指…...

浅谈云原生Cloud Native

目录 1.云原生是什么2.云原生与传统软件有什么区别3.云原生有哪些代表性的技术 1.云原生是什么 云原生&#xff08;Cloud Native&#xff09;是一种构建和运行应用程序的方法&#xff0c;可以充分利用云计算模型的优势。云原生是一种面向服务的架构&#xff08;SOA&#xff09…...

解决react报错“JSX 表达式必须具有一个父元素“

现象如下&#xff1a; 原因&#xff1a; 新插入的dom元素跟已有的dom元素平级了&#xff0c;必须创建一个共有的根元素 解决办法&#xff1a; 使用<> </>标签作为根元素&#xff0c;把所有子元素包裹起来 <> ....原代码 </> 问题解决&#xff01;…...

Spring学习笔记7 Bean的生命周期

Spring学习笔记6 Bean的实例化方式_biubiubiu0706的博客-CSDN博客 Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁. 这样我们才可以知道在哪个时间节点上调用了哪个类的哪个方法,知道代码该写在哪里 Bean的生命周期之粗略5步 Bean生命周期的管理可以参考S…...

React 如何导出excel

在现代的Web开发中&#xff0c;数据导出是一个非常常见的需求。而在React应用中&#xff0c;我们经常需要将数据导出为Excel文件&#xff0c;以便用户可以轻松地在本地计算机上查看和编辑。本文将介绍如何在React应用中实现导出Excel文件的功能。 章节一&#xff1a;安装依赖 …...

Texlive2020 for win10 宏包更新

用命令提示符更新texlive的宏包,这个方法非常简单实用 1.以管理员身份打开命令提示符 2.系统自动选择镜像网站 tlmgr option repository ctan 3.更新宏包 tlmgr update --self --all 其中–self参数表示升级tlmgr本身,–all表示升级所有宏包,这样就可以将所有宏包更新了 4.列…...

Ps 在用鼠标滚轮缩放图片时,速度太快?

1.原因 在于安装了第三方鼠标优化软件Mos&#xff0c;它起着对第三方鼠标全局浏览效果的优化&#xff0c;使浏览更加顺滑&#xff0c;而不精确&#xff0c;消除了mac使用第三方鼠标浏览页面时的卡顿问题。这也使得像ps、ai这类软件&#xff0c;在进行页面缩放时&#xff0c;变得…...

基于docker进行Grafana + prometheus实现服务监听

基于docker进行Grafana Prometheus实现服务监听 Grafana安装Prometheus安装Jvm监控配置服务器主机监控(基础cpu&#xff0c;内存&#xff0c;磁盘&#xff0c;网络) Grafana安装 docker pull grafana/grafanamkdir /server/grafanachmod 777 /server/grafanadocker run -d -p…...

模型层及ORM介绍

模型层及ORM介绍 模型层 负责跟数据库之间进行通信 配置MySQL&#xff0c;下载MySQLclient 创建数据库 进入mysql数据库执行create database 数据库名 default charset utf8通常数据库名跟项目名保持一致settings.py里进行数据库的配置修改 DATABASES 配置项的内容&#x…...

QQ邮箱怎么设置SMTP接口服务器?

在现如今信息快速传递的时代&#xff0c;邮件已成为我们工作、学习和生活中必不可少的一部分。而作为每位用户必备的一款邮箱&#xff0c;QQ邮箱一直以其稳定、高效、安全的特点深受大家的青睐。但是你是否觉得每次发邮件都需要打开QQ邮箱网页&#xff0c;进行繁琐的操作很是麻…...

【操作系统笔记四】高速缓存

CPU 高速缓存 存储器的分层结构&#xff1a; 问题&#xff1a;为什么这种存储器层次结构行之有效呢&#xff1f; 衡量 CPU 性能的两个指标&#xff1a; 响应时间&#xff08;或执行时间&#xff09;&#xff1a;执行一条指令平均时间 吞吐量&#xff0c;就是 1 秒内 CPU 可以…...

uniapp获取openid

要获取用户的openid&#xff0c;需要使用微信小程序的登录API。以下是一个简单的示例代码&#xff1a; // 在page中引入wx-login组件 import wxLogin from /components/wx-loginexport default {components: { wxLogin },data() {return {openid: }},methods: {// wxLogin组件…...

测试工程师面试之设计测试用例

以下的问题答案&#xff0c;仅供参考&#xff0c;如小伙伴们有更好的答案&#xff0c;欢迎大家评论区留言&#xff0c;谢谢大家 测试工程师面试之设计测试用例 1、请说一说简单用户界面登陆过程都需要做哪些分析2、 请对此系统设计测试用例&#xff1a;一个系统&#xff0c;多个…...

html页面仿word文档样式(vue页面也适用)

目录 文章title&#xff1a; 标题&#xff1a; 正文&#xff1a; 完整代码&#xff1a; 页面效果&#xff1a; 文章title&#xff1a; <div><h3 style"display: flex;justify-content: center; align-items: center; color: #000;">实验室招新报名公…...

如何在控制台打印sql语句

步骤一&#xff1a; log4j2.xml中做以下配置 <logger name"xxx.infrastructure.mysql.mapper"level"debug" additivity"false"><appender-ref ref"Console"/></logger>步骤二&#xff1a;IDEA下载Free Mybatis Plu…...

【Vue3 源码解析】reactive 全家桶

// 泛型约束&#xff1a;只能传入引用类型 export function reactive<T extends object>(target: T): UnwrapNestedRefs<T> // 判断只读&#xff0c;否则创建reactive响应式对象 export function reactive(target: object) {// if trying to observe a readonly pr…...

目标检测YOLO实战应用案例100讲-基于YOLO的遥感目标检测(续)

目录 3.4 YOLOv3 3.5 YOLOv4 3.6 YOLOv5 改进的YOLOv4算法 4.1 Triple Loss损失函数的应用...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...