- Notifications
You must be signed in to change notification settings - Fork 379
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