【Linux】进程间通信 -- 命名管道

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

前言

在管道的通信中,除了匿名管道,还有一个命名管道
匿名管道只支持具有“亲戚关系”的进程间通信,而命名管道就可以支持不同的,任意的进程通信。
那就下来就开始我们今天的学习。

【Linux】进程间通信 -- 命名管道

一. 命名管道

匿名管道的两种使用方式:指令的 ' | ' 和pipe()函数
命名管道也有两种使用方式:指令的 ' mkfifo 和 mkfifo()函数'

我们使用一下指令的mkfifo
mkfilo 命名管道名
【Linux】进程间通信 -- 命名管道
管道文件属性的最前面的是p,普通文件是 -,链接文件是l

我们简单使用一下命名管道
【Linux】进程间通信 -- 命名管道
这两个是不同的进程,一个是echo "hello" 将" hello "输出到显示器,但是重定向到 fifo管道中
一个是将fifo管道内容读出,重定向到cat,cat内部再将内容重定向到显示器
这样就实现两个不同进程通信了。

我们还可以更直观的感受,两个不同进程的通信。
在输入处,改成循环,这样写数据的进程就可以一直输入读数据的进程就一直读取。
【Linux】进程间通信 -- 命名管道

命名管道,也是内存级文件,并不会像普通文件那样刷盘,将数据写入磁盘,同匿名管道一般,其内部就是一个缓冲区

二. 命名管道的应用

上面我们使用了指令层面的命名管道,接下来我们要使用代码创建命名管道,并且基于命名管道,实现多进程通信。

创建管道文件的函数
【Linux】进程间通信 -- 命名管道

第一个参数是要创建的管道文件的文件名,第二个参数是管道文件的默认权限
创建成功返回0不成功返回-1

我们创建一个客户端,一个服务端,客户端写数据,服务端读数据。
因为我们要实现不同进程的通信,所以需要两个可执行程序。我们还可以将一些公共的信息放在一个 .hpp文件中

comm.hpp

#include<iostream>
#include<string>

//管道名
const std::string filename="./fifo";
//默认权限
const mode_t mode=0666;

我们让server客户端创建管道
server.cpp

#include<iostream>
#include<sys/types.h>
#include<sys/stat.h>
#include<cstring>
#include<cerrno>
#include<fcntl.h>
#include<unistd.h>
#include"comm.hpp"

//服务端
//接收数据
int main()
{
    //1. 创建管道文件,只需要创建一次

    //更改掩码
    umask(0);//该掩码的改变只印象该进程

    int n=mkfifo(filename.c_str(),mode);
    if(n!=0)
    {
        std::cout<<errno<<" : "<<strerror(errno)<<std::endl;
        return 1;
    }

    std::cout<<"create file success"<<std::endl;

    //2.服务端以读方式打开管道文件
    int rfd=open(filename.c_str(),O_RDONLY);
    if(rfd<0)
    {
        std::cout<<errno<<" : "<<strerror(errno)<<std::endl;
        return 2;
    }

    std::cout<<"open file success , begin ipc"<<std::endl;

    //3. 正常通信
    while(true)
    {
        char buffer[64]={0};
        ssize_t n=read(rfd,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n]='\0';
            std::cout<<"client# "<<buffer<<std::endl;
        }
        else if(n==0)
        {
            //写端关闭,返回值会变成0
            std::cout<<"通信结束"<<std::endl;
            break;
        }
        else
        {
            std::cout<<errno<<" : "<<strerror(errno)<<std::endl;
        }
    }

    close(rfd);

    //删除管道文件
    unlink(filename.c_str());
    return 0;
}

client.cpp

#include<iostream>
#include"comm.hpp"
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cstring>
#include<cassert>

int main()
{
    //1.不需要创建管道,直接以写的方式打开就好
    int wfd=open(filename.c_str(),O_WRONLY);
    if(wfd<0)
    {
        std::cerr<<errno<<" : "<<strerror(errno)<<std::endl;
        return 1;
    }


    //开始进行常规通信
    char buffer[64];
    while(true)
    {
        std::cout<<"请输入你的消息:";
        //C语言的函数,关于字符串的输出输入不需要-1
        //系统调用的函数,关于字符串的函数需要-1
        char*msg=fgets(buffer,sizeof(buffer)-1,stdin);
        assert(msg);
        (void)msg;

        //将\n覆盖掉
        //abcdef\n\0   
        //01234567
        buffer[strlen(buffer)-1]='\0';

        //识别退出信息
        //忽略大小写的比较
        if(strcasecmp(buffer,"quit")==0)
        {
        	//输入"quit",就跳出循环
            break;
        }

        ssize_t n=write(wfd,buffer,strlen(buffer));
        assert(n>=0);
        (void)n;
    }

    close(wfd);

    return 0;
}

部分运行结果如下
【Linux】进程间通信 -- 命名管道

结束语

本篇文章内容到此结束,感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
【Linux】进程间通信 -- 命名管道文章来源地址https://www.toymoban.com/news/detail-418813.html

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

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

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

相关文章

  • 【Linux】进程间通信——命名管道

    匿名管道只能用来进行进程间通信,让具有血缘关系的进程进行通信 让毫不相关的进程之间进行通信,就需要采用命名管道通信 因为该文件有文件名称的,而且必须要有,所以叫做命名管道 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 mkfifo fifo 制作一个管道

    2023年04月15日
    浏览(38)
  • 【Linux】进程间通信 -- 命名管道 | mkfifo调用

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

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

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

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

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

    2024年01月20日
    浏览(36)
  • 进程间通信(命名管道)

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

    2024年02月06日
    浏览(40)
  • 进程间通信之利用命名管道进行通信

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

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

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

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

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

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

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

    2024年02月05日
    浏览(43)
  • 【Linux】进程通信之匿名管道通信

    我们往往需要多个进程协同,共同完成一些事情。 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。

    2024年04月14日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包