Linux:命名管道实现IPC(进程间通信七)

上篇博客我们说过在这篇博客我们将改进我们上篇博客写的,命名管道实现简易通信,下面是改进之后的代码,这里我不详细写出来,希望大家可以凭借上节课的知识以及代码内容,真正的自己理解并且复现一遍~~

Makefile:

cpp 复制代码
.PHONEY : all
all : server client
server : server.cc
	g++ server.cc -o server
client : client.cc
	g++ client.cc -o client

.PHONEY : clean
clean :
	rm -f client server

server.cc:

cpp 复制代码
#include "common.hpp"

int main()
{
    NamedFifo fifo(PATH, FIFO_FILE);
    FifoOper server(PATH, FIFO_FILE);
    server.OpenForRead();
    server.Read();
    server.Close();
    return 0;
}

client.cc:

cpp 复制代码
#include "common.hpp"

int main()
{
    FifoOper client(PATH, FIFO_FILE);
    client.OpenForWrite();
    client.Write();
    client.Close();
    return 0;
}

common.hpp:

cpp 复制代码
#pragma once

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

#define PATH "."
#define FIFO_FILE "fifo"

class NamedFifo
{
public:
    NamedFifo(std::string path, std::string name)
        : _path(path)
        , _name(name)
    {
        umask(0);
        _fifoname = _path + "/" + _name;
        int n = mkfifo(_fifoname.c_str(), 0666);
        if (n == -1)
        {
            std::cout << "mkfifo fail" << std::endl;
        }
        else 
        {
            std::cout << "mkfifo success" << std::endl;
        }
    }

    ~NamedFifo()
    {
        int n = unlink(_fifoname.c_str());
        if (n == -1)
        {
            std::cout << "~fifo fail" << std::endl;
        }
        else 
        {
            std::cout << "~fifo success" << std::endl;
        }
    }
private:
    std::string _path;
    std::string _name;
    std::string _fifoname;
};

class FifoOper
{
public:
    FifoOper(std::string path, std::string name)
        : _path(path)
        , _name(name)
        , _fd(-1)
    {
        _fifoname = _path + "/" + _name;
    }

    ~FifoOper()
    {
        std::cout << "~FifoOper" << std::endl;
    }

    void OpenForRead()
    {
        _fd = open(_fifoname.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            std::cout << "OpenForRead fail" << std::endl;
            return;
        }
        std::cout << "OpenForRead success" << std::endl;
    }

    void OpenForWrite()
    {
        _fd = open(_fifoname.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            std::cout << "OpenForWrite fail" << std::endl;
            return;
        }
        std::cout << "OpenForWrite success" << std::endl;
    }

    void Read()
    {
        char buffer[1024];
        while (true)
        {
            int number = read(_fd, buffer, sizeof(buffer) - 1);
            if (number > 0)
            {
                buffer[number] = '\0';
                std::cout << "client say : " << buffer << std::endl;
            }
            else if (number == 0)
            {
                std::cout << "client quit! server quit, too!" << std::endl;
                break;
            }
            else 
            {
                std::cout << "Read error" << std::endl;
                break;
            }
        }
    }

    void Write()
    {
        std::string message;
        while (true)
        {
            std::cout << "please enter# ";
            std::getline(std::cin, message);
            write(_fd, message.c_str(), message.size());
        }
    }

    void Close()
    {
        if (_fd > 0)
            close(_fd);
    }
private:
    std::string _path;
    std::string _name;
    std::string _fifoname;
    int _fd;
};

这就算有关管道通信的知识啦(命名管道与匿名管道),但是我们的通信之旅还没有完,大家敬请期待后续内容啦~~

相关推荐
古法老登瞎折腾4 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.5 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu5 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈7 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
云边云科技_云网融合8 小时前
连锁门店组网怎么做?SD-WAN 多分支组网的架构选型、部署与成本结构
服务器·数据库·php
云上先途18 小时前
企业 AI 服务部署周期多久,会不会影响原有业务运转?
大数据·运维·人工智能
网络小江8 小时前
组网第35课:静态路由——下一跳、出接口、默认路由、浮动静态与黑洞路由
服务器·网络·默认路由·黑洞路由·浮动静态路由
执伞人ONLY9 小时前
AI知识库自动化知识加工没做对,人工整理永远追不上知识产生
运维·人工智能·自动化
slongzhang_9 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮9 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节