Linux 有名管道

有名管道(Named Pipe),也称为FIFO(First In, First Out),是一种特殊的文件系统对象,它允许不相关的进程之间的通信。与无名管道不同,有名管道在文件系统中有一个路径名,因此不相关的进程可以通过这个路径名来访问同一个有名管道。

原理

有名管道的原理是基于FIFO队列的先进先出的数据结构。数据写入有名管道的一端,然后从另一端读取。有名管道在文件系统中以特殊文件的形式存在,通常具有FIFOpipe类型。

 
int mkfifo(const char *pathname, mode_t mode);
  • pathname:有名管道的路径名。
  • mode:有名管道的权限模式,通常使用八进制数(如 0666)。
  • 返回值:
    • 成功时返回 0
    • 失败时返回 -1,并设置 errno 以指示错误原因,可能的错误包括                          EACCES(权限不足)                 
      •         EEXIST(管道已存在)                  
    • ENAMETOOLONG(路径名太长)等。

使用方法

  1. 创建有名管道

    使用mkfifo命令或mkfifo系统调用在文件系统中创建一个有名管道。

    • 使用mkfifo命令:

      bash

      mkfifo mypipe

      这将在当前目录下创建一个名为mypipe的有名管道。

    • 使用mkfifo系统调用:

      #include <sys/types.h>
      #include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);

      pathname是有名管道的路径名,mode是权限模式。

  2. 写入有名管道

    使用write系统调用或库函数write()向有名管道写入数据。

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);

    首先,需要打开有名管道:

    int fd = open("mypipe", O_WRONLY);

    然后写入数据:

    const char *message = "Hello, FIFO!";
    write(fd, message, strlen(message));
  3. 从有名管道读取

    使用read系统调用或库函数read()从有名管道读取数据。

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);

    首先,需要打开有名管道:

    int fd = open("mypipe", O_RDONLY);

    然后读取数据:

    char buffer[100];
    read(fd, buffer, sizeof(buffer));
  4. 关闭有名管道

    使用close系统调用或库函数close()关闭有名管道的文件描述符。

    #include <unistd.h>
    int close(int fd);
    close(fd);
  5. 删除有名管道

    使用unlink系统调用或库函数unlink()删除有名管道

    unlink("mypipe");

示例代码

以下是一个简单的有名管道使用示例,包括一个写入端和一个读取端。

创建端(creat.c):

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(){if(mkfifo("myfifo",0666) == -1){perror("myfifo");return 0;}return 0;
}

写入端(writer.c):

#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int main(){int fd;char buf[50];fd=open("myfifo",O_WRONLY);if( fd==-1 ){perror("open");return 1;}while(1){	bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);if( write(fd,buf,strlen(buf)+1) == -1 ){perror("write");close(fd);return 0;}}close(fd);return 0;
}

读取端(reader.c):

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(){int fd;char buffer[100];fd = open("myfifo",O_RDONLY);if(fd==-1){perror("open");return 1;}while(1){ if(read(fd,buffer,sizeof(buffer))==-1){perror("read");close(fd);return 0;}printf("收到信息:%s\n",buffer);}close(fd);return 0;
}

注意事项

  1. 权限问题:创建有名管道时,需要确保进程有足够的权限。
  2. 阻塞与非阻塞:有名管道的读写操作默认是阻塞的。如果需要非阻塞操作,可以设置文件描述符的非阻塞属性。
  3. 数据完整性:有名管道不保证数据的完整性,如果需要确保数据完整性,可以使用消息队列等其他IPC机制。
  4. 同步问题:有名管道不提供同步机制,如果需要同步,可以使用信号量等同步工具。

有名管道是一种简单有效的进程间通信方式,适用于需要通过文件系统路径进行通信的场景。

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

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

相关文章

异步4位计数器(Quartus与Modelsim联合仿真)

异步计数器&#xff08;也称为ripple-through counter&#xff09;的特点是每一位触发器的输出作为下一位触发器的时钟输入&#xff0c;因此计数速度会因为级联触发器的传播延迟而受到限制。这种计数器的最大工作频率通常低于同步计数器。 一、电路符号 输入信号&#xff1a;时…

若依cloud版集成微信扫码登录-绑定篇

前言 集成微信扫码登录的话&#xff0c;需要把项目的账号和微信账号进行绑定&#xff0c;然后才可以进行扫码登录 本篇内容是项目绑定微信 还需要申请一个微信开放平台账号 微信公众平台申请&#xff08;测试平台&#xff09;-CSDN博客 平台的项目回调接口可以先不写&…

鸿蒙应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 鸿蒙应用App测试-专项测试&#xff08;DevEco Testing&#xff09;-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得…

Linux 配置JDK

文章目录 一、下载Oracle-JDK1.1、如何正确的下载JDK二、配置JDK环境变量2.1 环境变量配置2.1.1、修改vim /etc/profile 添加jdk的路径一、下载Oracle-JDK 1.1、如何正确的下载JDK 首先我要安装的是oracle-jdk,这个时候什么地方都不要去,就去oracle的官网,然后找到,jdk的下…

springBoot 自动配置与starter

目录 一、自动配置 Springboot实现自动配置的核心机制 Conditional的作用是什么&#xff1f; 如何自定义自动配置&#xff1f; 步骤 例子分析 自动配置的优先级 如何禁用特定的自动配置&#xff1f; 二、starter 如何理解Spring Boot中的starter&#xff1f; 如何自…

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

java后端工程师转行AI大模型岗,工作、自我提升两不误!

随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域&#xff0c;如Java&#xff0c;转向人工智能领域&#xff0c;今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

Rust-宏编程

巴山楚水凄凉地&#xff0c;二十三年弃置身。 怀旧空吟闻笛赋&#xff0c;到乡翻似烂柯人。 沉舟侧畔千帆过&#xff0c;病树前头万木春。 今日听君歌一曲&#xff0c;暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

leetcode912.排序数组的题解

题目描述&#xff1a; 题目要求在不使用任何内置函数的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))。 笔者使用了快速排序&#xff0c;但是直接使用最原始的快速排序&#xff0c;有些特殊的测试用例会超时。 1&#xff09;如果数组本身基本有序&#xff0c;则使用原始…

TikTok品牌出海:从“流量为王”到“价值为王”

随着市场竞争的加剧&#xff0c;品牌逐渐意识到&#xff0c;仅仅依靠流量已不足以在海外市场立足&#xff0c;必须实现从“流量为王”到“价值为王”的转变。本文Nox聚星将和大家探讨品牌如何与TikTok达人合作&#xff0c;在海外市场中建立长期稳定的品牌形象。 一、品牌出海的…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…

Kafka 可观测性最佳实践

Kafka 概述 Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列&#xff0c;是一个实时数据处理系统&#xff0c;可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点&#xff1a; 异步处理服务解耦流量削峰 监控 Kafka 是非常重要的&#xff0c;因…

《XGBoost算法的原理推导》12-13树的叶子节点权重w和映射关系q 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们重新定义一颗树&#xff0c;包括两个部分&#xff1a; 叶子结点的权重向量 w w w&#xff1b;实例 -> 叶子结点的映射关系 q q q&#xff08;本质是树的…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

消费疲软下,家居品牌如何利用营销实现新的突围与增长?

在消费疲软的大环境下&#xff0c;家居品牌面临着前所未有的挑战与机遇。尤其以耐消品为主的家居行业&#xff0c;也受到一定程度影响——有效需求不足导致产能过剩&#xff0c;营销乏力&#xff0c;市场竞争开始变得激烈&#xff0c;不少家居品牌正在面临业绩压力。家居品牌如…

连985都没有面试机会 二本就更没戏了:瞎说,这就是三年高考的意义

最近有二本同学在直播里说&#xff1a;“看到很多面经说&#xff0c;连985同学都没有面试机会&#xff0c;而且是零offer。那我们二本就更没戏了。” 其实这种言论是在瞎扯。 我们一直在强调校招是分层的。 现在学生太多了&#xff0c;而且招聘对学历是有要求的。比如大厂的…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加&#xff0c;增加&#xff1a;2024年第45周|共53周&#xff0c;星期三&#xff0c;今年时间剩余&#xff0c;本周时间剩余} 开源竞争&#xff1a; 开源竞争&#xff08;当你无法掌握一个技术就开源这个技术…

高分辨率高电流监控器电路设计

1 简介 该单电源电流检测解决方案可以在分流电阻器上测量50mA 至10A 范围内的电流信号。电流检测放大器可以在0V 至75V 的宽共模电压范围内测量分流电阻器。全差分放大器(FDA) 执行单端至差分转换&#xff0c;并以1MSPS 的最大数据速率驱动范围为5V 的SAR ADC 差分输入。可以调…