命名管道通信
特点,写端在没有往管道里面写内容时,读端会处于阻塞状态
共享内存
特点,读端在什么时候都可以进行读操作 ,拷贝次数少,通信次数快
makefile 中使用g++进行编译
要实现将上述两个特点进行融合,可以先实例化一个 命名管道对象,确保写端在写时,不会让读端进行读
读端代码:
#include "shm.hpp"
#include "namedpipe.hpp"
using namespace std;
// server 是读端int main()
{//  1. 先创建共享内存Shm shm(gpathname, gproj_id, gCreator);// client在向共享内存写入数据时,一开始都先使用zero()将其中的数据清空char* shmaddr = (char*)shm.addr();shm.debugShm();//  2. 创建管道,这里创建管道纯粹是为了让读端能够等待写端写完数据之后再读NamedPipe fifo(common_path, Creator);fifo.openForRead();std::string tmp;fifo.readNamedPipe(&tmp);// std::cout << "I am server, i am waiting for information..." << std::endl;std::cout << shmaddr << std::endl;sleep(4);// while (true)// {//     //让当前进程//     std::string tmp;//     fifo.readNamedPipe(&tmp);//     std::cout << "shm memory content: " << shmaddr << std::endl;//     sleep(1);// }char* addr = (char *)shm.attachShm();// 之后就可以通过addr来使用addr后面的共享内存了shm.detachShm(addr);return 0;
}
写端代码
#include "shm.hpp"
#include "namedpipe.hpp"
using namespace std;
// client 是写端int main()
{//引入管道之后就可以让写端写完之后,读端才开始读了  Shm shm(gpathname, gproj_id, gUser);shm.zero();char* shmaddr = (char*)shm.addr();sleep(3);std::string info = {'i',' ', 'a', 'm', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 'A'};NamedPipe fifo(common_path, User);fifo.openForWrite();int i = 0;for(auto ch : info){shmaddr[i++] = ch;}std::string tmp = "I am client";// std::cout << "I am writing information..." << std::endl;fifo.writeNamedPipe(tmp);sleep(5);// char ch = 'A';// while (ch <= 'Z')// {//     shmaddr[ch-'A'] = ch;//     std::string tmp = "wakeup";//     std::cout << "add " << ch << " into Shm, " << "wakeup reader" << std::endl;//     fifo.writeNamedPipe(tmp);//     sleep(2);//     ch++;// }char *addr = (char *)shm.attachShm();return 0;
}