#include #include #include namespace bip = boost::interprocess; using MQ = bip::message_queue; template static inline void safe_copy(std::array& dst, std::string_view src) { std::copy_n(src.data(), std::min(src.size(), N), dst.data()); dst.back() = 0; // make sure of NUL termination } struct AccessQueue { std::array name{0}; std::array action{0}; AccessQueue(std::string_view n = "", std::string_view a = "") { safe_copy(name, n); safe_copy(action, a); } }; static_assert(std::is_standard_layout_v); struct X { void send() { AccessQueue packet("asd", "vsq"); try { mq.send(&packet, sizeof(packet), 0); } catch(std::exception const & ex) { std::cout << ex.what() << std::endl; } } AccessQueue receive() { AccessQueue retval; report(); try { unsigned int priority; MQ::size_type recvd_size; mq.try_receive(&retval, sizeof(AccessQueue), recvd_size, priority); } catch(std::exception const & ex) { std::cout << ex.what() << std::endl; } report(); return retval; } void report() { std::cout << mq.get_num_msg() << "\t" << mq.get_max_msg_size() << "\t" << mq.get_max_msg() << std::endl; } MQ mq { bip::open_or_create, "somequeue", 10, sizeof(AccessQueue) }; }; int main() { X tryit; tryit.send(); auto const& [name, action] = tryit.receive(); std::cout << std::quoted(name.data()) << " " << std::quoted(action.data()) << std::endl; }