Skip to content

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

Open
@saladjay

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

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