【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)
作者主页: 作者主页
本篇博客专栏:Linux
创作时间 :2024年11月2日
命名管道:
- 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
- 命名管道是一种特殊类型的文件
我们可以使用mkfifo命令来创建一个管道。
然后通过echo往里面写入一段内容:
回车之后管道不会关闭,在终端2查看可以发现他的内存大小仍然是0,当我们在管道2打印出内容后,管道就自动关闭了
当我们这样执行的时候,我们就可以发现在一直不停的打印我们输入到管道的内容
下面我们在程序里面建立一个管道:
返回值为0是成功,不为0就是失败。
下面是一个运用命名管道进行通信的例子:
Pipe.hpp:(这里是一些的共享的资源,包括路径,打开管道,关闭管道)
#include
#include #include #include #include #include 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.hpp" class Init { public: Init() { umask(0); int n = ::mkfifo(gpathname.c_str(), gmode); if (n < 0) { std::cerr << "mkfifo errno" << std::endl; return; } std::cout << "mkfifo success" << std::endl; } ~Init() { int n = ::unlink(gpathname.c_str()); if (n != 0) { std::cerr << "unlink