Linux进程间通信——管道(下)

news2024/11/16 1:31:30

前文

一,什么是命名管道?

 二,命名管道的基本原理

三,创建命名管道实现两个进程对写

 四,匿名管道和命名管道的区别

总结


前文

上篇文章我们主要讲了匿名管道的定义以及基本原理,但是匿名管道有一个致命的缺陷,就是只能用于具有亲缘关系(有同一个祖先)的进程间的通信,而本文就是讲一下可以用于任意进程间通信的管道——命名管道

一,什么是命名管道?

命名管道其实就是一个特殊的文件,称为命名管道是因为在创建时需要加上名字,其中的内容是内存级别的专门用来进程间通信的,也就是说并不会保存到磁盘上面。

在linux中用下面的指令可以创建一个命名管道:

  • mkfifo [管道名字]

 

如上图所示,左右两边是同一台机器同一个路径下,我们首先在左边创建了匿名管道,然后我们就成功创造出fifo的特殊文件,然后我们用echo将内容重定向到命名管道中,然后左边cat进行读取,成功读取,echo和cat两个进程成功通信

 当然除了linux下指令的创建,在语言层操作系统也给我们提供了创建命名管道的接口,如下所示:

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

 1.创建成功返回0,失败返回其他

2.path为所创建的目录以及管道的名字,如./fifo

3.mode为命名管道的初始权限

其具体用法如下:

int main(int argc, char *argv[])
{
 mkfifo("./fifo", 0644);
 return 0;
}

 二,命名管道的基本原理

接下来我们讲一下命名管道的基本原理

 

 如上图,进程1以写的方式打开命名管道fifo,然后进程2以读的方式打开命名管道fifo,经过os的优化,进程2会直接用已经被进程1打开的fifo,这样进程1和进程2就看到了同一个文件,就可以通过这个文件进行通信,然后进程1写入内容,进程2进行读取,这样两个进程就通过命名管道fifo实现了通信

三,创建命名管道实现两个进程对写

写端

#include <iostream>
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string>
#include <assert.h>

using namespace std;

int main()
{
    //写方创造管道文件

    int n=mkfifo("./fifo",0666);
    if(n!=0)//创建失败
    {
        cout<<errno<<":"<<strerror(errno)<<endl;
        return 1;
    }

    //以写的方式打开文件
    int fd=open("./fifo",O_WRONLY);
    assert(fd>=0);

    //写入内容
    while(true)
    {
        char buffer[1024];

        char* ret=fgets(buffer,sizeof(buffer)-1,stdin);//从屏幕读取内容

        //写入管道
        size_t size=write(fd,buffer,strlen(buffer));
        assert(size>=0);//判断是否成功写入

    }

    //关闭文件
    close(fd);
    return 0;
}

读端

#include <iostream>
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
using namespace std;

int main()
{
    //直接以读的方式打开
    int fd=open("./fifo",O_RDONLY);
    assert(fd>=0);

    //读取内容
    while(true)
    {
        char buffer[1024];

        size_t size=read(fd,buffer,sizeof(buffer)-1);
        if(size>0)//读取有内容,打印内容
        {
            cout<<buffer<<endl;
        }
        else if(size=0)//读取数为0,说明写端不再写入,读端退出
        {
            cout<<"写端停止写入,读端退出"<<endl;
            break;
        }
        else//读取异常退出
        {
            cout<<"读取异常"<<endl;
            break;
        }
    }

    //关闭
    close(fd);
    return 0;
}

 运行效果

 四,匿名管道和命名管道的区别

1. 匿名管道由pipe函数创建并打开。
2. 命名管道由mkfifo函数创建,打开用open
3. FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

总结

本节命名管道讲完,管道的内容基本就结束了,如果兄弟们觉得有所收货可以给个三连鼓励一下

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

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

相关文章

HashSet、LinkedHashSet、TreeSet有什么区别

- HashSet、LinkedHashSet 和 TreeSet 都是 Set接口的实现类&#xff0c;都能保证元素唯一&#xff0c;并且都不是线程安全的。HashSet 的底层数据结构是哈希表&#xff08;基于 HashMap 实现&#xff09;&#xff0c;元素存入和取出顺序不一致。LinkedHashSet 的底层数据结构…

C++制作五子棋

正文 01 思路 我没有选择专业的五子棋棋型&#xff0c;用我自己的逻辑&#xff08;初高中玩五子棋的方法&#xff09;&#xff0c;去实现简单的人机对战。 首先因为要计算五子棋每一步的分数&#xff0c;那么你就要分析每一步形成的棋盘&#xff0c;以下图为例&#xff1a;…

蓝桥杯专题-试题版含答案-【风险度量】【括号配对问题】【ASCII码排序】【素数求和】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

【Java高级编程】枚举类注解

枚举类&注解 1、枚举类的使用1.1、枚举类的使用1.2、如何定义枚举类1.3、Enum类的主要方法 2、注解的使用2.1、注解的概述2.2、常见的Annotation示例2.3、如何自定义注解&#xff1a;参照SuppressWarnings定义2.4、JDK提供的4种元注解2.5、JDK 8中注解的新特性&#xff1a;…

2023-06-25:redis中什么是缓存穿透?该如何解决?

2023-06-25&#xff1a;redis中什么是缓存穿透&#xff1f;该如何解决&#xff1f; 答案2023-06-25&#xff1a; 缓存穿透 缓存穿透指的是查询一个根本不存在的数据&#xff0c;在这种情况下&#xff0c;无论是缓存层还是存储层都无法命中。因此&#xff0c;每次请求都需要访…

关于C++图论树的某些题图形提示

一、去教室的路。 猫猫大学有n条路&#xff0c;每条路都有一个数字编号&#xff0c;其中的一条路一定与另外2条路相连&#xff0c;请你打出这个学校的地图。 输入1&#xff1a; 1 2 3 4 2 3 45 4 45 1 输出1&#xff1a; 1 2 3 4 5 45 图解 &#xff1…

动态住宅代理VS静态住宅代理,怎么选择?

现在&#xff0c;越来越多的海外代理服务商均支持动态住宅IP与静态住宅IP,很多小伙伴就疑惑&#xff0c;这二者有什么区别呢&#xff1f;哪个更好&#xff1f;其实&#xff0c;没有哪个更好&#xff0c;只有哪一个更合适您的业务。 无论动态住宅IP还是静态住宅IP都来自真实的住…

【软件测试】10道性能测试高频面试题,你能答上多少?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试包含了…

表格el-table多出一条横线,怎么解决(el-table表格下方多一条线的问题)

最近在写el-table表格的时候&#xff0c;发现的问题&#xff0c;表格多出一条横线&#xff0c; 可以看出其它行&#xff0c;都是正常显示&#xff0c;只有第7行多出一条横线&#xff0c;找了好久&#xff0c; 最后发现是el-table表格的伪元素&#xff0c;问题就出在这&#xf…

B站化播放量为播放时长,是谁的狂欢?

6月26日晚&#xff0c;B站举办了14周年庆典晚会。在晚会上&#xff0c;除了周深、美依礼芽同框献唱受到关注&#xff0c;B站董事长兼CEO陈睿的演讲内容同样值得深思&#xff1a; 一来&#xff0c;陈睿提到&#xff0c;要将目前B站视频前台显示的播放量数据从次数改为分钟数&am…

精进ARM计算架构,催生人工智能产业的巨大跨越

在优化ARM计算架构以支持人工智能应用方面&#xff0c;以下是一些常见的方法和技术&#xff1a; 算法和模型设计优化&#xff1a;选择合适的算法和模型结构对于在ARM架构上高效执行人工智能任务至关重要。设计轻量级的模型、减少冗余操作和参数量&#xff0c;使用适合ARM架构的…

【K8S系列】深入解析K8S调度

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

扩展ExtendedFloatingActionButton滚动收缩展开行为

效果 首先ExtendedFloatingActionButton有默认的Behavior : ExtendedFloatingActionButtonBehavior,这个类是为了ExtendedFloatingActionButton不被SnakBar所遮挡&#xff0c;并且这个类它是protected,所以为了保留原有的设计&#xff0c;自定义的Behavior不能在外部定义&#…

Go语言单元测试

1、Go语言单元测试 Go语言中的测试依赖 go test 命令&#xff0c;go test 命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录 内&#xff0c;所有以 _test.go 为后缀名的源代码文件都是 go test 测试的一部分&#xff0c;不会被 go build 编译到最终的可执行 文件…

【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023-06-28

链接&#xff1a;https://pan.baidu.com/s/18oE308_NVNPaCOACw_H5Hw?pwdabc1 利用爬虫抓取双色球开奖号码&#xff0c;获取完整数据&#xff0c;简洁45行代码实现&#xff0c;更新时间2023-06-28 这是网上的数据&#xff0c;怎么将它爬取下来 它将只爬取最近30期的双色球开…

星辰秘典:解开Python项目的神秘面纱——迷宫之星(迷宫探索与求解)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;你好&#x…

文件系统理解——磁盘文件

磁盘文件 1. 问题提出2. 了解磁盘的物理结构2.1 磁盘大体结构2.2 磁盘的具体物理结构 3.对磁盘结构逻辑抽象3.1 OS是通过CSH方法进行扇区的管理的吗&#xff1f;3.2 磁盘逻辑过程 4.文件系统4.1 管理思想4.2 区结构Boot BlockSuper BlockGroup Descriptor Tableinode Table &am…

共享办公室在国内外的发展史以及现状介绍

共享办公室&#xff0c;这个曾经陌生的概念&#xff0c;如今已成为全球范围内炙手可热的话题。在这个时代&#xff0c;越来越多的人开始关注灵活性和协作性&#xff0c;而共享办公室正是在这种需求下应运而生的。本文将带您一探共享办公室的国内外发展史、国内当前发展现状以及…

记录一次nginx占用cpu饱满解决

一天下午&#xff0c;突然就爆满了。刚开始服务器都登不上&#xff0c;后来服务器可以登录上&#xff0c;宝塔进不去&#xff0c;网站访问不了&#xff0c;top后发现nginx爆满 执行下列代码&#xff0c;停止nginx服务 systemctl stop nginx 虽然停止了 可以上宝塔 再次手动…

硬件工程师JD

不知道这么做合不合适&#xff0c;我先发一个试试&#xff0c;团队在招人&#xff0c; 岗位是 航天航空电子工程师1&#xff0c;混合电推和起发电方向&#xff1b; 电机控制硬件工程师1&#xff0c;新能源汽车电机控制器硬件开发方向。 工作内容&#xff1a; 1、负责硬件系…