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

这篇具有很好参考价值的文章主要介绍了Linux进程间通信——管道(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前文

一,什么是命名管道?

 二,命名管道的基本原理

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

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

总结


前文

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

一,什么是命名管道?

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

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

  • mkfifo [管道名字]

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

如上图所示,左右两边是同一台机器同一个路径下,我们首先在左边创建了匿名管道,然后我们就成功创造出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;
}

 二,命名管道的基本原理

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

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

 如上图,进程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;
}

 运行效果

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

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

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

总结

本节命名管道讲完,管道的内容基本就结束了,如果兄弟们觉得有所收货可以给个三连鼓励一下文章来源地址https://www.toymoban.com/news/detail-507118.html

到了这里,关于Linux进程间通信——管道(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • linux——进程间通信——命名管道

    linux——进程间通信——命名管道

     ✅1主页::我的代码爱吃辣 📃2知识讲解:Linux——进程间通信——命名管道 ☂️3开发环境:Centos7 💬4前言:命名管道是一种特殊的文件存放在文件系统中,而不是像管道那样存放在内核中。命名管道可以用于任何两个进程间的通信,而不限于同源的两个进程。当进程对

    2024年02月08日
    浏览(11)
  • 【Linux】进程间通信 -- 命名管道 | mkfifo调用

    【Linux】进程间通信 -- 命名管道 | mkfifo调用

    client.cpp : server.cpp : 然后创建 Makefile 使得我们更方便的去编译: 这样我们使用一条指令编译两个文件: 我们可以发现我们创建的 named_pipe 是以 p 开头而且有自己独立的 inode ,说明它是一个 独立的管道文件 我们执行下面脚本,主要的功能就是使用 echo 循环输出 hello world! 到管

    2024年02月13日
    浏览(12)
  • Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信

    Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信

    文章目录 一、管道的应用实例-父进程唤醒子进程,子进程执行某种任务 二、命名管道 1.创建一个命名管道 2.匿名管道与命名管道的区别 3.命名管道的打开规则 4.用命名管道实现serverclient通信 后续将源码上传到gitee,上传后修改链接。 管道应用的一个限制就是只能具有共同祖

    2024年02月10日
    浏览(16)
  • 进程间通信(命名管道)

    进程间通信(命名管道)

    目录:            1.命名管道            2.创建命名管道 --------------------------------------------------------------------------------------------------------------------------------- 1.命名管道 1.管道的一个应用限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信 2.如果我们想在不相

    2024年02月06日
    浏览(11)
  • 进程间通信-命名管道

    进程间通信-命名管道

            先前已经了解了匿名管道,但是这是适用于有血缘关系的进程间,如果无血缘关系的进程要实现通信, 此时需要有另一种通信方案-命名管道。为什么命名管道可以用于无血缘关系的进程间通信,什么是命名管道,为什么说它是有名字的,后面我们会一一了解。

    2024年01月20日
    浏览(10)
  • 进程间通信之利用命名管道进行通信

    进程间通信之利用命名管道进行通信

    命名管道(Named Pipe),也被称为FIFO(First In, First Out),是一种在Unix和Unix-like操作系统中用于进程间通信的特殊文件类型。它允许不相关的进程通过文件系统中的路径名进行通信。 命名管道(Named Pipe)是一种在Unix和Unix-like系统中用于进程间通信的特殊文件类型。它的作用主

    2024年01月19日
    浏览(14)
  • 学习系统编程No.20【进程间通信之命名管道】

    学习系统编程No.20【进程间通信之命名管道】

    北京时间:2023/4/15/10:34,今天起床时间9:25,睡了快8小时,昨天刷视屏刷了一个小时,本来12点的时候发完博客洗把脸就要睡了,可惜,看到了一个标题,说实话,现在的标题党是懂人性的,接下来就是无法自拔的一个小时快乐时光,但导致莫名间接熬夜,你说烦人不烦人!但

    2023年04月17日
    浏览(9)
  • 【Linux从入门到精通】通信 | 管道通信(匿名管道 & 命名管道)

    【Linux从入门到精通】通信 | 管道通信(匿名管道 & 命名管道)

        本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信  1、3 进程通信的方式 二、匿名管

    2024年02月09日
    浏览(11)
  • 【Linux】匿名管道与命名管道,进程池的简易实现

    【Linux】匿名管道与命名管道,进程池的简易实现

    本质是先让不同的进程看到同一份资源,也就是两个进程都能对管道文件的缓冲区进行操作 这里我们pipe的时候,会使用两个文件描述符,这两个文件描述里面存的file结构体是同一个,也就是管道文件的file结构体,file结构体中存储有inode以及系统缓冲区,此时fork一个子进程

    2024年02月05日
    浏览(11)
  • 【Linux】进程通信之管道通信详解

    【Linux】进程通信之管道通信详解

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 其实管道通信是Unix中最古老的进程间通信的形式了: 管道通信是一种进程间通信的方式,它可以让一个进程的输出作为另一个进程的输入,实现数据的传输、资源的共享、事件的通知和进程的控制。 管道通信分为两种类型:匿名

    2023年04月19日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包