From b90ba316b54db321d3e8aaac7df93b46d80b9d9c Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期二, 22 十二月 2020 15:47:41 +0800 Subject: [PATCH] 三个没有回收的信号 --- src/queue/mm.c | 16 +++++-- test/Makefile | 2 test_net_socket/test_net_mod_socket.c | 24 ++++++++++++ test/test.c | 35 +---------------- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/queue/mm.c b/src/queue/mm.c index 979cced..dc6f5be 100644 --- a/src/queue/mm.c +++ b/src/queue/mm.c @@ -310,7 +310,14 @@ if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) { //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch); // 鍙湁褰撳墠涓�涓繘绋媋ttach鍒板叡浜唴瀛樹笂 - if(shmid_ds.shm_nattch == 1) { + if (shmid_ds.shm_nattch > 1) { + //detache + if (shmdt(shmp) == -1) { + LoggerFactory::getLogger()->error(errno, "mm_destroy shmdt"); + } + SemUtil::inc(mutex); + return false; + } else { hashtable_destroy(hashtable); //detache @@ -326,14 +333,13 @@ else LoggerFactory::getLogger()->debug("shared memory destroy\n"); + LoggerFactory::getLogger()->debug(errno, "mm_destroy: real destroy."); + SemUtil::inc(mutex); SemUtil::remove(mutex); return true; - } else { - SemUtil::inc(mutex); - return false; - } + } } else { err_msg(errno, "mm_destroy shmctl IPC_STAT"); diff --git a/test/Makefile b/test/Makefile index 7046699..f719401 100755 --- a/test/Makefile +++ b/test/Makefile @@ -13,7 +13,7 @@ INCLUDES += -I${DEST}/include/shmqueue -I$(ROOT)/include/usgcommon -PROGS = ${DEST}/test test2 +PROGS = ${DEST}/test DEPENDENCES = $(patsubst %, %.d, $(PROGS)) diff --git a/test/test.c b/test/test.c index ab21287..40f5af7 100644 --- a/test/test.c +++ b/test/test.c @@ -1,39 +1,10 @@ #include "usg_common.h" static void sig_quit(int); +#define SIGCLOSE1 (SIGRTMIN +1) int main(void) { - sigset_t - newmask, oldmask, pendmask; - if (signal(SIGQUIT, sig_quit) == SIG_ERR) - err_exit(errno, "can鈥檛 catch SIGQUIT"); - /* - * Block SIGQUIT and save current signal mask. - */ - sigemptyset(&newmask); - sigaddset(&newmask, SIGQUIT); - if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) - err_exit(errno, "SIG_BLOCK error"); - sleep(5); - /* SIGQUIT here will remain pending */ - if (sigpending(&pendmask) < 0) - err_exit(errno, "sigpending error"); - if (sigismember(&pendmask, SIGQUIT)) - printf("\nSIGQUIT pending\n"); - /* - * Restore signal mask which unblocks SIGQUIT. - */ - if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) - err_exit(errno, "SIG_SETMASK error"); - printf("SIGQUIT unblocked\n"); - sleep(5); - exit(0); + printf("%d, %d , %d\n", SIGRTMIN, SIGRTMAX, SIGCLOSE1); /* SIGQUIT here will terminate with core file */ } - -static void sig_quit(int signo) -{ - printf("caught SIGQUIT\n"); - if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) - err_exit(errno, "can鈥檛 reset SIGQUIT"); -} + \ No newline at end of file diff --git a/test_net_socket/test_net_mod_socket.c b/test_net_socket/test_net_mod_socket.c index fecf754..f777773 100644 --- a/test_net_socket/test_net_mod_socket.c +++ b/test_net_socket/test_net_mod_socket.c @@ -33,9 +33,33 @@ void * client; +void *proxy_server_handler(void *sockt) { + pthread_detach(pthread_self()); + + char action[512]; + while ( true) { + printf("Input action: Close?\n"); + if(scanf("%s",action) < 1) { + printf("Invalide action\n"); + continue; + } + + if(strcmp(action, "close") == 0) { + net_mod_server_socket_close(sockt); + break; + } else { + printf("Invalide action\n"); + } + } +} + void start_net_proxy(int port) { + pthread_t tid; printf("Start net proxy\n"); void *serverSocket = net_mod_server_socket_open(port); + + // 鍒涘缓涓�涓嚎绋�,鍙互鍏抽棴server + pthread_create(&tid, NULL, proxy_server_handler, serverSocket); if(net_mod_server_socket_start(serverSocket) != 0) { err_exit(errno, "net_mod_server_socket_start"); } -- Gitblit v1.8.0