Skip to content

ipc::chan对象执行析构或者disconnect时发生段错误 #149

Description

@saladjay
#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时发生段错误

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions