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

这篇具有很好参考价值的文章主要介绍了Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

一、管道的应用实例-父进程唤醒子进程,子进程执行某种任务

二、命名管道

1.创建一个命名管道

2.匿名管道与命名管道的区别

3.命名管道的打开规则

4.用命名管道实现server&client通信


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


一、匿名管道的应用实例-父进程唤醒子进程,子进程执行某种任务

后续将源码上传到gitee,上传后修改链接。

二、命名管道

  • 管道应用的一个限制就是只能具有共同祖先的进程进行通信
  • 如果想让不相关的进程交换数据,可以使用FIFO文件来做,它被称为命名管道
  • 命名管道是一种特殊的文件

1.创建一个命名管道

创建命令:mkfifo filename

创建函数: int mkfifo(const char * filename,mode_t mode);

参数:管道的名字,创建的管道权限

2.匿名管道与命名管道的区别

  • 匿名管道由pipe函数创建并打开
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间的区别在于,他们创建与打开的方式不同,这些工作完成后,他们有相同的语义。

3.命名管道的打开规则

  • 如果是只读方式打开FIFO
  • O_NONBLOCK disable:阻塞直到有相应进程为写而打开FIFO
  • O_NONBLOCK enable:立刻返回成功
  • 如果是只写方式打开FIFO
  • O_NONBLOCK disable:阻塞直到有相应进程为读而打开FIFO
  • O_NONBLOCK enable:立刻返回失败,错误码为ENXIO

4.用命名管道实现server&client通信

实例功能:

1创建管道

2 创建的命名管道可以让两个进程通信

3. 进程A 向管道中写入 进程B从管道中读取并打印到标准输出

需求分析:首先需要创建两个进程,client端和server端,还需要一个common文件来声明共同的定义和方法,所以创建三个文件client.cc,server.cc,common.hpp。接下来逐个文件分析

1.首先,创建管道,只需要创建一次即可,本次案例在server.cc中创建,client.cc中使用即可

common.hpp
#pragma once 
#include<iostream>
#include<string>
#define NUM 1024
const std::string fifoname = "./fifo";
uint32_t mode = 0666;


server.cc

umask = 0; //这个设置不影响系统的umask,只影响此进程的
int n = mkfifo(fifoname.c_str(),mode);

至此管道已经创建

2.让服务端直接开启管道文件

int rfd = open(fifoname.c_str(),O_RDONLY);
//打开失败
if(rfd < 0)
{
    std::cout<<errno<<endl;
    return 2;
}

//打开成功
    ....

3.client端不需要创建文件,只用写方式打开文件就可以

// int open(const char * pathname ,int oflag, ...) 
//成功则返回文件描述符,失败-1


int wfd = open(filename.c_str(),O_WRONLY);
if(wfd <0)
{
    //写方式打开失败
    return 1;
}


4.两端开始通信

server端:
 
char buffer[1024];
while(true)
{
    buffer[0] = 0;

    //read(int fd , void * buf, size_t count) fd是文件描述符,用于要定位读取的文件或者其他设备,buf为缓冲区地址,count是要读取的字节数,读成功返回实际读取的字节数,返回复数读取失败,返回0读取到文件末尾
    
    //从rfd文件中读取x个字节到buffer中
    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)
    {
        std::cout<<"client quit, me too" <<std::endl;
        break;
    }

    else
    {
        std::cout<<errno<<std::endl;
        break;
     }
}

client端:

    char buffer[NUM];
    while(true)
    {
        std::cout<<"please enter your message : ";
        char * msg = fgets(buffer,sizeof(buffer)-1,stdin);
        assert(msg);
        (void)msg;
        
        //处理发送消息的回车,最后一个字符删掉
        buffer[strlen(buffer)-1] = o;
        ssize_t n = write(wfd,buffer,strlen(buffer));
        assert(n>= 0);
        (void)n;
    }

    
    

5.两端通信结束,关闭对应的文件描述符

close(wfd);

close(rfd);文章来源地址https://www.toymoban.com/news/detail-682710.html


到了这里,关于Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【LInux】进程间通信 -- 匿名管道

    我们在学习进程管理,进程替换时,都强调了 进程的独立性 ,那进程间通信是什么?这好像和进程的独立性 相矛盾 吧? 那么今天,我们就来学习 进程间通信 ,和第一种通信方式 – 管道 进程间通信,并没有破坏进程的独立性这一特点,这点我们在 管道 讲解 而进程通信的

    2023年04月19日
    浏览(34)
  • Linux进程间通信【匿名管道】

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 进程间通信简称为 IPC (Interprocess communication),是两个不同进程间进行任务协同的必要基础。进行通信时,首先需要确保不同进程之间构建联系,其次再根据不同的使用场景选择不同

    2024年02月08日
    浏览(79)
  • Linux--进程间的通信-匿名管道

    进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作 。 进程间通信方式: 管道(Pipe) : 管道是最基本的进程间通信方式 ,它是一种 半双工 的通信方式,通过管

    2024年04月14日
    浏览(43)
  • 【看表情包学Linux】IPC 进程间通信 | PIPE 管道 | 匿名管道 | 管道通信的原理 | 系统调用: pipe 接口

       🤣  爆笑 教程  👉 《看表情包学Linux》 🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅! 目录 Ⅰ. 进程间通信(I

    2024年02月14日
    浏览(39)
  • 【探索Linux】—— 强大的命令行工具 P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)

    当今计算机系统中,进程间通信扮演着至关重要的角色。随着计算机系统的发展和复杂性的增加,多个进程之间的协作变得更加必要和常见。进程间通信使得不同进程能够共享资源、协调工作、传输数据,并实现更加复杂和强大的功能。本文将深入探讨进程间的通信,以及管

    2024年02月05日
    浏览(71)
  • 【Linux】匿名管道实现简单进程池

    管道内部没有数据且子进程不关闭自己的写端文件fd,读端(父进程)就要阻塞等待,直到管道里有数据。 管道内部被写满了且父进程(读端)不关闭自己的读端fd,写端(子进程)写满以后就要阻塞等待。 对于写端而言,如果写端不写了且关闭了写端fd,读端就会将管道中

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

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

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

    1.进程间为什么要进行通信? 进程间通信的是为了协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。 2.进程间通信的目的包括: 数据传输:一个进程需要将它的数据发送给另一个进程; 资源共享:多个进程间共享同样的资源; 通知事件:一个进程

    2024年02月16日
    浏览(41)
  • 【Linux从入门到精通】通信 | 管道通信(匿名管道 & 命名管道)

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

    2024年02月09日
    浏览(46)
  • Linux系统编程:采用管道的方式实现进程间通信

    目录 一. 进程间通信概述 二. 管道的概念  三. 通过管道实现进程间通信 3.1 实现原理 3.2 匿名管道创建系统接口pipe 3.3 管道通信的模拟实现 3.4 管道通信的访问控制规则 3.5 管道通信的特点 四. 通过匿名管道实现进程池 4.1 进程池的概念 4.2 进程池的模拟实现 五. 命名

    2024年02月12日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包