管道-有名管道

一、有名管道 

  1. 有名管道与匿名管道的不同:

    • 有名管道提供了一个路径名,并以FIFO的文件形式存在于文件系统中。
    • 与匿名管道不同,有名管道可以被不相关的进程使用,只要它们可以访问该路径,就能够通过有名管道进行通信。
  2. FIFO的打开和使用方式:

    • 一旦打开了有名管道,可以使用与操作匿名管道和其他文件相同的 I/O 系统调用,如 read()write()close()
  3. 数据交换顺序和先入先出(FIFO):

    • 与管道类似,有名管道也有一个写入端和读取端。
    • 从有名管道中读取数据的顺序与写入的顺序是一样的,符合先入先出(FIFO)的原则。
  4. FIFO的特点:

    • FIF0在文件系统中作为一个特殊文件存在,但其内容存放在内存中。
    • 当使用有名管道的进程退出后,FIFO文件仍然保存在文件系统中,以便以后使用。

 

 

 

 二、有名管道创建

  • 有名管道的路径和名称可以根据实际需求进行设置,但应遵循文件系统的规则。
  • 有名管道创建成功后,其他进程可以通过相同的路径和名称打开该有名管道,以进行进程间通信。
  • 在实际应用中,需要对返回值进行更详细的错误处理,并根据需要设置更复杂的权限模式。
/*创建fifo文件1. 通过命令 : mkfifo名字2. 通过函数 : int mkfifo(const char *pathname,mode_t mode);#include<sys/types.h>#include<sys/stat.h>int mkfifo(const char *pathname,mode_t mode);参数:-pathname: 管道名称的路径-mode: 文件的权限,和open的mode一样返回值:-成功:0-失败:-1,并设置错误号**/
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <string.h>int main(){int ret =mkfifo("fifo1",0664);if(ret==-1){perror("mkfifo");exit(0);}return 0;
}

 三、案例

        一个用于向有名管道写入数据,另一个用于从有名管道中读取数据。这两个程序共同演示了有名管道的基本用法

 write端:

  • 判断文件是否存在,如果不存在则创建有名管道文件。
  • 以只写方式打开管道。
  • 使用 write 函数向管道中写入数据。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>// 向管道中写数据
/*有名管道的注意事项:1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道读管道:管道中有数据,read返回实际读到的字节数管道中无数据:管道写端被全部关闭,read返回0,(相当于读到文件末尾)写端没有全部被关闭,read阻塞等待写管道:管道读端被全部关闭,进行异常终止(收到一个SIGPIPE信号)管道读端没有全部关闭:管道已经满了,write会阻塞管道没有满,write将数据写入,并返回实际写入的字节数。
*/
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端:

  • 以只读方式打开管道。
  • 使用 read 函数从管道中读取数据。
  • 当写端关闭后,read 返回 0,程序检测到写端断开连接并退出。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.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;
}

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

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

相关文章

IDEA中的神仙插件——Smart Input (自动切换输入法)

推荐专栏&#xff1a;开发环境配置攻略 致力于记录学习过程中各种软件的安装及环境配置操作&#xff0c;并提供详细的步骤说明和丰富的配图。涵盖了 Java、Python、IntelliJ IDEA、Tomcat、MySQL 等常见开发工具和服务器组件的配置&#xff0c;为初学者提供一个实用、全面的配置…

使用python脚本的时间盲注完整步骤

文章目录 一、获取数据库名称长度二、获取数据库名称三、获取表名总长度四、获取表名五、获取指定表列名总长度六、获取指定表列名七、获取指定表指定列的表内数据总长度八、获取指定表指定列的表内数据 一、获取数据库名称长度 测试环境是bwapp靶场 SQL Injection - Blind - …

RocketMQ Dashboard说解

RocketMQ Dashboard 是 RocketMQ 的管控利器&#xff0c;为用户提供客户端和应用程序的各种事件、性能的统计信息&#xff0c;支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查看 …

树莓集团涉足直播产业园区运营,成都直播产业园区再添黑马

树莓集团涉足成都直播产业园运营领域&#xff0c;这一消息引起了业界的广泛关注。在这个无限可能的直播领域中&#xff0c;树莓集团将与上市公司德商产投紧密合作&#xff0c;立志为成都直播行业的发展注入新的活力。成都天府蜂巢直播产业园推行着一系列创新的政策措施&#xf…

凉鞋的 Godot 笔记 102. 场景与节点的增删改查

在上一篇&#xff0c;我们完成了 Godot 引擎的 Hello World 输出&#xff0c;并且完成了第一个基本循环: 通过这次基本循环的完成&#xff0c;我们获得了一点点的 Godot 使用经验&#xff0c;这非常重要。 有实践经验后再去补充理论 和 先学习理论后去实践相比&#xff0c;前者…

2023年中国纯棉纱行业现状及发展前景分析[图]

棉纱是棉纤维经纺纱工艺加工而成的纱&#xff0c;经合股加工后称为棉线。根据纺纱的不同工艺&#xff0c;可分为普梳纱和精梳纱。精梳纱选用优质原料&#xff0c;成纱中纤维伸直平行、结杂少、光泽好、条干匀、强力高&#xff0c;这类棉纱多用于织造高档。 棉纱分类 资料来源&…

什么样的枕头可以让睡眠更舒适——四个月的反复试验结果

如何提高睡眠质量&#xff0c;我们先从睡眠中的呼吸质量谈起&#xff0c;这里面有大量的数据和记录&#xff0c;我后续会整理我这七八年来积累的所有睡眠质量数据进行分析汇总和处理。 几个月前我在看我的华为手表监控的睡眠数据时看到了关于睡眠中呼吸质量的数据&#xff0c;最…

vue重修004上部

文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验props&data、单向数据流 小黑记事本&#xff08;组件版&#xff09;基础组件结构需求和实…

【Java每日一题】— —第十九题:用二维数组存放九九乘法表,并将其输出。(2023.10.03)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十九题。 &#x1f3af;问题&#xff1a; 用二维数组存放九九乘法表&#xff0c;并将其输出。 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; System.out.println("九九乘法表如…

为什么炒股人更爱融资?融券交易背后的风险与获利机会

炒股过程中&#xff0c;融资和融券交易是常见的操作方式。然而&#xff0c;据观察&#xff0c;炒股的人更倾向于选择融资交易&#xff0c;而融券交易相对较少。那么&#xff0c;是什么导致了这种偏好呢&#xff1f;本文将解析融资和融券交易的运作机制&#xff0c;以及投资者为…

jira流转issue条目状态transitions的rest实用脚本,issue状态改变调整

官方文档链接地址&#xff1a; POST Transition issue Performs an issue transition and, if the transition has a screen, updates the fields from the transition screen. sortByCategory To update the fields on the transition screen, specify the fields in the fiel…

1.3 互联网的组成

思维导图&#xff1a; 前言&#xff1a; 我的笔记&#xff1a; #### 一、总览 - **互联网的结构**&#xff1a; - 具有全球覆盖和复杂的拓扑结构。 - 即便结构复杂&#xff0c;还是可以从工作方式上简化为两大部分&#xff1a;边缘部分和核心部分。 #### 二、边缘部分 -…

基于R的linkET包qcorrplot可视化Mantel test相关性网络热图分析correlation heatmap

写在前面 需求是对瘤胃宏基因组结果鉴定到的差异菌株与表观指标、瘤胃代谢组、血清代谢组、牛奶代谢组中有差异的部分进行关联分析&#xff0c;效果图如下&#xff1a; 数据准备 逗号分隔的csv格式文件&#xff0c;两个表格&#xff0c;一个是每个样本对应的表观指标数据&…

PyQt5+Qt设计师初探

在上一篇文章中我们搭建好了PyQt5的开发环境&#xff0c;打铁到趁热我们基于搭建好的环境来简单实战一把 一&#xff1a;PyQt5包模块简介 PyQt5包括的主要模块如下。 QtCore模块——涵盖了包的核心的非GUI功能&#xff0c;此模块被用于处理程序中涉及的时间、文件、目录、数…

【CVPR2023】Selective Query Recollection:增强基于查询的目标检测的训练

论文题目&#xff1a;Enhanced Training of Query-Based Object Detection via Selective Query Recollection 代码&#xff1a;https://github.com/Fangyi-Chen/SQR 作者在知乎的导读&#xff1a;https://zhuanlan.zhihu.com/p/610347565 导读 传统目标检测方法需要大量手工处…

非目标代谢组学(untargeted metabolomics)中常用的方法学考察的方法(四)

QC样本的制备&#xff1a; 混合相同体积的所有待检测样本&#xff0c;然后按照与待测样本相同的前处理方法来处理QC样本&#xff0c;之后进样进行LC-MS分析。 样本检测时&#xff0c;通常在检测最开始运行几次QC样本&#xff0c;之后根据样本量的大小在每检测几个样本之后检测…

Codeforces Round 665 (Div. 2) (A-F)

A.Problem - A - Codeforces &#xff08;1&#xff09;题意 给你个X轴&#xff0c;初始A点在n这个位置&#xff0c;O在源点0&#xff0c;问你要把B放在哪才能让|AB-BO| k&#xff0c;最小化A需要移动多少次。 &#xff08;2&#xff09;思路 直接分情况套路即可。 &#xff0…

springcloud:四、nacos介绍+启动+服务分级存储模型/集群+NacosRule负载均衡

nacos介绍 nacos是阿里巴巴提供的SpringCloud的一个组件&#xff0c;算是eureka的替代品。 nacos启动 安装过程这里不再赘述&#xff0c;相关安装或启动的问题可以见我的另一篇博客&#xff1a; http://t.csdn.cn/tcQ76 单价模式启动命令&#xff1a;进入bin目录&#xff0…

SpringBoot Validation入参校验国际化

在 Spring Boot 中&#xff0c;可以使用 Validation 和国际化来实现对入参的校验。 常用的校验 NotNull验证字段值不能为 nullNotEmpty验证字段值不能为 null 或空字符串NotBlank验证字符串字段值不能为空、null&#xff0c;并且必须至少包含一个非空白字符Size验证字符串、…

【Spring】Spring 创建和使用

Spring 创建和使用 一. 创建 Spring 项目1. 创建⼀个 Maven 项目2. 添加 Spring 框架⽀持3. 添加启动类 二. 存储 Bean 对象1. 创建 Bean2. 将 Bean 注册到容器 三. 获取并使⽤ Bean 对象1. 创建 Spring 上下文2. 获取指定的 Bean 对象3. 使用 Bean Spring 就是⼀个包含了众多⼯…