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

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

 ✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——进程间通信——命名管道
☂️<3>开发环境:Centos7
💬<4>前言:命名管道是一种特殊的文件存放在文件系统中,而不是像管道那样存放在内核中。命名管道可以用于任何两个进程间的通信,而不限于同源的两个进程。当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作,否则该命名管道不会自行消失 。

目录

一.命名管道特点:

 二.创建一个命名管道

1.命令行创建

2.程序创建

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

 四.命名管道的打开规则

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


linux——进程间通信——命名管道,linux,运维,服务器

一.命名管道特点:

  • 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。
  • 如果我们想在不相关的进程之间交换数据,可以使用FIFO(first in first out)文件来做这项工作,它经常被称为命名管道。
  • 命名管道是一种特殊类型的文件。

 二.创建一个命名管道

1.命令行创建

命名管道可以从命令行上创建,命令行方法是使用下面这个命令:

mkfifo filename

linux——进程间通信——命名管道,linux,运维,服务器

2.程序创建

命名管道也可以从程序里创建,相关函数有:

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

 测试代码:

#include <cstring>
#include <cerrno>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>

using namespace std;

const char *namepipe = "./namepipe";

mode_t mode = 0664;
int main()
{

    // 1.创建命名管道namepipe,
    // namepipe 匿名管道的路径和名字,mode时命令管道的创建权限
    // 成功返回0,出错返回1。错误码被设置
    int ret = mkfifo(namepipe, mode);
    if (ret == -1)
    {
        cerr << errno << ":" << strerror(errno) << endl;
    }
    return 0;
}

测试结果:

linux——进程间通信——命名管道,linux,运维,服务器

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

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

 四.命名管道的打开规则

如果当前打开操作是为读而打开FIFO时:

  1.     O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
  2.     O_NONBLOCK enable:立刻返回失败,错误码为ENXIO

如果当前打开操作是为写而打开FIFO时:

  1.     O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
  2.     O_NONBLOCK enable:立刻返回失败,错误码为ENXIO
     

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

代码:

Comm.hpp

#include <string.h>
#include <cstdio>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
using namespace std;

const char *namepipe = "./namepipe";

mode_t mode = 0666;

server.cc

#include "Comm.hpp"

int main()
{

    // 1.创建命名管道namepipe,
    // server,client,只需要一端创建管道即可
    int ret = mkfifo(namepipe, mode);
    if (ret == -1)
    {
        cerr << errno << ":" << strerror(errno) << endl;
    }

    // 2.打开管道
    // server给client发消息,server以写的方式打开
    int pipefd = open(namepipe, O_WRONLY);
    if (pipefd == -1)
    {
        cerr << errno << ":" << strerror(errno) << endl;
    }

    // 3.开始通信
    while (1)
    {
        int quit = 0;
        char buff[1024] = {0};
        char *str = fgets(buff, sizeof(1024), stdin);
        // 如果写入的字符串是"quit",将quit制1,用于退出
        if (strcmp(str, "quit") == 0)
        {
            quit = 1;
        }
        // 向指定的文件描述符写入即可
        size_t n = write(pipefd, buff, strlen(str));
        if (quit)
        {
            break;
        }
    }

    return 0;
}

client.cc

#include "Comm.hpp"

int main()
{
    // 1.打开管道
    int pipefd = open(namepipe, O_RDONLY);

    // 2.开始通信,接受信息
    while (1)
    {
        int quit = 0;
        char buff[1024] = {0};
        size_t n = read(pipefd, buff, sizeof(buff));
        if (n == 0)
            continue;
        buff[n] = 0;
        printf("%s", buff);
        fflush(stdout);
        if (strcmp(buff, "quit") == 0)
        {
            break;
        }
    }

    return 0;
}

 makefile:

all:client server
client:client.cc
	g++ -o $@ $^ -std=c++11

server:server.cc
	g++ -o $@ $^ -std=c++11

.PHONY:clean
clean:
	rm -rf client server namepipe

测试结果:

linux——进程间通信——命名管道,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-713375.html

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

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

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

相关文章

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

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 命名管道通信属于 IPC 的其中一种方式,作为管道家族,命名管道的特点就是 自带同步与互斥机制、数据单向流通 ,与匿名管道不同的是:命名管道有自己的名字,因此可以被没有血

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(31)
  • 【Linux后端服务器开发】管道设计

    目录 一、管道通信 二、匿名管道 1. 匿名管道通信 2. 匿名管道设计 三、命名管道 comm.hpp client.cc serve.cc 进程通信 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程向另一个(一组)进程发送信息,通知它们发

    2024年02月13日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包