Open
Description
#include <map>
#include <chrono>
#include <thread>
#include <iostream>
#include <memory>
#include "libipc/ipc.h"
using msg_line = ipc::chan<ipc::relat::single, ipc::relat::single, ipc::trans::unicast>;
class shared_memory_register{
public:
shared_memory_register(){
};
~shared_memory_register(){
for(auto iter=shared_memory_dict.begin(); iter!=shared_memory_dict.end(); iter++){
iter->second->send(ipc::buff_t('\0'));
iter->second->disconnect();
}
};
bool add_shared_memory(const std::string& name){
if(shared_memory_dict.find(name)==shared_memory_dict.end()){
shared_memory_dict[name] = std::make_unique<msg_line>(name.c_str(), ipc::sender);
return true;
}else{
return false;
}
};
msg_line* get_sender(const std::string& name){
if(shared_memory_dict.find(name)!=shared_memory_dict.end()){
return shared_memory_dict[name].get();
}else{
return nullptr;
}
}
private:
std::map<std::string, std::unique_ptr<msg_line>> shared_memory_dict;
};
shared_memory_register _register;
bool create_shared_memory(const std::string& memory_name){
_register.add_shared_memory(memory_name);
return true;
};
bool send_data(const std::string& memory_name, std::vector<float>& data){
msg_line* sender = _register.get_sender(memory_name);
if(sender != nullptr){
sender->send(data.data(), data.size());
}
return true;
}
bool receive_data(const std::string& memory_name, std::vector<float>& data){
msg_line rec{memory_name.c_str(), ipc::receiver};
while(true){
auto buffer = rec.recv();
float* data_pointer = reinterpret_cast<float*>(buffer.data());
size_t size = buffer.size();
std::vector<float> received_data(data_pointer, data_pointer+size);
for(size_t i{0};i<size;++i){
std::cout<<received_data[i]<<std::endl;
}
}
return true;
}
// bool
constexpr char const mode_s__[] = "s";
constexpr char const mode_r__[] = "r";
int main(int argc, char *argv[]){
if (argc < 2) return 0;
std::string mode {argv[1]};
std::vector<float> data;
for(size_t i{0};i<10;++i){
data.push_back(float(i));
}
if (mode == mode_s__) {
create_shared_memory(std::string{"abcd"});
for(size_t count{0};count<10;++count){
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::vector<float> float_data();
send_data(std::string{"abcd"}, data);
std::cout<<"**********"<<count<<"**********"<<std::endl;
}
} else if (mode == mode_r__) {
std::vector<float> data_received;
receive_data(std::string{"abcd"}, data_received);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
for(size_t i{0};i<data_received.size();++i){
std::cout<<data_received[i]<<" ";
}
std::cout<<std::endl;
}
}
平台 ubuntu18.04
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~18.04)
代码分支版本v1.3.0
代码编译后单独执行发送模式,不使用另一个命令行执行接受模式
在代码执行disconnect时发生段错误
Metadata
Metadata
Assignees
Labels
No labels