11
2+ #include < signal.h>
3+
24#include < iostream>
35#include < string>
46#include < thread>
57#include < chrono>
8+ #include < atomic>
69
710#include " libipc/ipc.h"
811
912namespace {
1013
14+ std::atomic<bool > is_quit__ {false };
15+ ipc::channel *ipc__ = nullptr ;
16+
1117void do_send (int size, int interval) {
1218 ipc::channel ipc {" ipc" , ipc::sender};
19+ ipc__ = &ipc;
1320 std::string buffer (size, ' A' );
14- while (true ) {
21+ while (!is_quit__. load (std::memory_order_acquire) ) {
1522 std::cout << " send size: " << buffer.size () + 1 << " \n " ;
1623 ipc.send (buffer, 0 /* tm*/ );
1724 std::this_thread::sleep_for (std::chrono::milliseconds (interval));
@@ -20,11 +27,13 @@ void do_send(int size, int interval) {
2027
2128void do_recv (int interval) {
2229 ipc::channel ipc {" ipc" , ipc::receiver};
23- while (true ) {
30+ ipc__ = &ipc;
31+ while (!is_quit__.load (std::memory_order_acquire)) {
2432 ipc::buff_t recv;
2533 for (int k = 1 ; recv.empty (); ++k) {
2634 std::cout << " recv waiting... " << k << " \n " ;
2735 recv = ipc.recv (interval);
36+ if (is_quit__.load (std::memory_order_acquire)) return ;
2837 }
2938 std::cout << " recv size: " << recv.size () << " \n " ;
3039 }
@@ -34,6 +43,23 @@ void do_recv(int interval) {
3443
3544int main (int argc, char ** argv) {
3645 if (argc < 3 ) return -1 ;
46+
47+ auto exit = [](int ) {
48+ is_quit__.store (true , std::memory_order_release);
49+ if (ipc__ != nullptr ) ipc__->disconnect ();
50+ };
51+ ::signal (SIGINT , exit);
52+ ::signal (SIGABRT , exit);
53+ ::signal (SIGSEGV , exit);
54+ ::signal (SIGTERM , exit);
55+ #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || \
56+ defined (WIN32) || defined (_WIN32) || defined (__WIN32__) || defined (__NT__) || \
57+ defined (WINCE) || defined (_WIN32_WCE)
58+ ::signal (SIGBREAK, exit);
59+ #else
60+ ::signal (SIGHUP , exit);
61+ #endif
62+
3763 std::string mode {argv[1 ]};
3864 if (mode == " send" ) {
3965 if (argc < 4 ) return -1 ;
0 commit comments