65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
#include <boost/interprocess/ipc/message_queue.hpp>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
|
|
namespace bip = boost::interprocess;
|
|
using MQ = bip::message_queue;
|
|
|
|
template<size_t N>
|
|
static inline void safe_copy(std::array<char, N>& 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<char, 64> name{0};
|
|
std::array<char, 64> 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<AccessQueue>);
|
|
|
|
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;
|
|
}
|