【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:Linux

                                                      创作时间 :2024年11月2日

9efbcbc3d25747719da38c01b3fa9b4f.gif

命名管道:

  • 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
  • 命名管道是一种特殊类型的文件 

我们可以使用mkfifo命令来创建一个管道。

然后通过echo往里面写入一段内容:

回车之后管道不会关闭,在终端2查看可以发现他的内存大小仍然是0,当我们在管道2打印出内容后,管道就自动关闭了

当我们这样执行的时候,我们就可以发现在一直不停的打印我们输入到管道的内容

下面我们在程序里面建立一个管道:

 返回值为0是成功,不为0就是失败。

下面是一个运用命名管道进行通信的例子:

Pipe.hpp:(这里是一些的共享的资源,包括路径,打开管道,关闭管道)

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

const string gpathname = "./myfifo";
const mode_t gmode = 0600;
const int gdefault = -1;
const int gsize = 1024;
const int gForWrite = O_WRONLY;
const int gForRead = O_RDONLY;


int OpenPipe(int flag)
    {
        int _fd = ::open(gpathname.c_str(), flag);
        if (_fd == -1)
        {
            std::cerr << "open errno" << std::endl;
            return _fd;
        }
        return _fd;
    }

    void ClosePipeHelper(int fd)
    {
        if (fd >= 0)
            ::close(fd);
    }


// class NamePipe
// {
// private:
    
// public:

// };

// int CreateNamePipe(string pathname)
// {
//     umask(0);
//     int n = mkfifo(pathname.c_str(), 0600);
//     if (n != 0)
//     {
//         std::cerr << "mkfifo errno" << std::endl;
//         return -1;
//     }
//     return n;
// }

// class NamePipe
// {
// public:
//     NamePipe()
//     {
//     }
//     ~NamePipe()
//     {
//     }

// private:
//     const string fifo_path;
//     int _id;
//     int _fd;
// };

Server.hpp及Server.cc

#include "Pipe
评论 68
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值