命名管道通信
特点,写端在没有往管道里面写内容时,读端会处于阻塞状态
共享内存
特点,读端在什么时候都可以进行读操作 ,拷贝次数少,通信次数快
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;
}