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.rhkb.cn/news/465447.html

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

相关文章

java.lang.NoClassDefFoundError: kotlin/jvm/JvmInline

springboot项目&#xff0c;调用接口时&#xff0c;报这个错误&#xff0c;跟踪断点发现数据库也查询到了数据&#xff0c;就是在返回时报错了&#xff0c;后来一看是pom.xml中引入了 <dependency><groupId>com.fasterxml.jackson.module</groupId><artif…

WebAPI编程(第五天,第六天,第七天)

WebAPI编程&#xff08;第五天&#xff0c;第六天&#xff0c;第七天&#xff09; **day05 - Web APIs****1.1. **元素偏移量 offset 系列1.1.1 offset 概述1.1.2 offset 与 style 区别offsetstyle 1.1.3 案例&#xff1a;获取鼠标在盒子内的坐标1.1.4 案例&#xff1a;模态框拖…

xshell连接不上linux的原因

1、首先我们确定好linux的配置&#xff0c;右键选择设置&#xff0c;将网络适配器设置成NAT模式 2、点击linux编辑&#xff0c;选择虚拟网络 打开以后选中自己要配置的服务 3、进入以后选中自己的服务&#xff0c;确保是NAT模式&#xff0c;然后配置好子网ip&#xff08;尽量ip…

进程与线程+多线程优势

区别&#xff1a; 1、进程中包含线程&#xff0c;每一个进程都至少一个线程&#xff08;主线程&#xff09; 2、进程是申请系统资源的最小单位 3、进程是CPU调度的最小单位 4、线程之间共享进程申请的系统资源 5、一个线程崩溃了会影响整个进程 进程的组织方式&#xff1…

Unity3D学习FPS游戏(8)装弹和弹夹UI显示

前言&#xff1a;实现了武器的基本发射功能&#xff0c;但是我们弹夹数量是有限&#xff0c;之前并没有做装弹和弹夹显示的功能。本篇实现装弹和弹夹显示。 装弹和弹夹UI显示 装弹目标思路和实现 弹夹UI显示目标弹夹UI的思路和实现UI代码的思路和实现 武器控制的完整代码效果补…

计算机网络——网络层导论

转发是局部功能——数据平面 路由是全局的功能——控制平面 网卡 网卡&#xff0c;也称为网络适配器&#xff0c;是计算机硬件中的一种设备&#xff0c;主要负责在计算机和网络之间进行数据传输。 一、主要功能 1、数据传输&#xff1a; 发送数据时&#xff0c;网卡将计算机…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说&#xff0c;两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

【MySQL】深度学习与解析 : 库的操作知识整合

前言&#xff1a;本节内容是MySQL库的操作&#xff0c; 内容较少&#xff0c; 大体内容为创建库、删除库、修改库、库备份操作。 ps:本节内容适合安装了MySQL的友友们进行观看&#xff0c; 实操更有利于记住哦。 目录 创建数据库 查看数据库列表 创建数据库 删除数据库 …

开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序与私域流量圈层

摘要&#xff1a;本文探讨了私域流量圈层的特点以及其在当今时代的重要性&#xff0c;分析了开源 AI 智能名片 21 链动模式 S2B2C 商城小程序源码在私域流量圈层构建中的作用&#xff0c;阐述了产品在圈层时代被标签化的现象&#xff0c;并以实例展示了如何利用该小程序源码打造…

第11章 LAMP架构企业实战

Linux下LAMP(Linux+Apache+MySQL/MariaDB+Perl/PHP/Python)是一组用来搭建动态网站的开源软件架构,本身是各自独立的软件服务,放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。 本章介绍互联网主流企业架构LAMP应用案例、PHP解释性语言详解、…

vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例

在vscode中&#xff0c;当我们安装了插件 PHP Debug&#xff08;xdebug.php-debug&#xff09;或者 xdebug.php-pack 后 我们通过内置默认的 php xdebug配置启动php项目后&#xff0c;默认情况下我们在vscode中设置断点是不会生效的&#xff0c;因为我们的内置php服务默认启动时…

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…

Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…

达梦数据守护集群_动态增加实时备库

目录 1、概述 2、实验环境 2.1环境信息 2.2配置信息 2.3 查看初始化参数 3、动态增加实时备库 3.1数据准备 3.2配置新备库 3.3动态增加MAL配置 3.4 关闭守护进程及监视器 3.5修改归档&#xff08;方法1&#xff1a;动态添加归档配置&#xff09; 3.6 修改归档&…

思维导图工具有哪些?10款思维导图特色介绍

电脑的普及&#xff0c;互联网的便捷。使我们平时工作、学习等场景下&#xff0c;常常离不开思维导图的辅助。思维导图是可以让我们所需要介绍的知识点以图文形式结合&#xff0c;展示出来。帮助我们方便理解。因此&#xff0c;一款好的思维导图工具&#xff0c;能让我们制作的…

7.2 设计模式

设计模式 7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.3 结构性设计模式1. Adapter (适配器)2. Bridge(桥接)3.Composite(组合)4.Decorator(装饰)5.Facade(外观)6.Flyweight(享元)7.Proxy(代理)8. 结构型模式比较 7.3.4 行为型设计模式1 Chain of Responsibility 责任链模式2…

【Wi-Fi】802.11ac wave1 vs 802.11ac wave2

参考链接 difference between 11ac wave1 and wave2 | 11ac-wave1 vs 11ac-wave2 什么是802.11ac和802.11ac Wave2 - 华为 Notes&#xff5c;802.11ac Wave1与Wave2 - 知乎 802.11ac-wave1 2013年&#xff0c;IEEE发布了802.11ac标准&#xff0c;在Wave2出来之后&#xf…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【MWorks】Ubuntu 系统搭建

升级 Ubuntu系统 sudo apt-get update sudo apt-get upgrade安装流程 sudo chmod x 路径/文件.run安装 sudo 路径/文件.run安装过程中两个选项都填 y 打开安装对应的文件夹 运行 syslab.sh 文件&#xff0c;运行结束后&#xff0c;就可以在左上角开始搜索到syslab了。

单测篇 - 如何mock静态常量

本文对应源码地址&#xff1a; https://github.com/nieandsun/NRSC-STUDY/tree/master/nrsc-unit-test-study 1 如何mock静态常量 先看如下代码&#xff0c;这里如何对方法中的静态常量DEMO_CONSTANT进行mock呢&#xff1f; public class Demo1StaticConstant {/**** 这里的类…