| | |
| | | if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) { |
| | | //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch); |
| | | // 只有当前一个进程attach到共享内存上 |
| | | 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 |
| | |
| | | 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"); |
| | |
| | | INCLUDES += -I${DEST}/include/shmqueue -I$(ROOT)/include/usgcommon |
| | | |
| | | |
| | | PROGS = ${DEST}/test test2 |
| | | PROGS = ${DEST}/test |
| | | |
| | | DEPENDENCES = $(patsubst %, %.d, $(PROGS)) |
| | | |
| | |
| | | #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’t 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’t reset SIGQUIT"); |
| | | } |
| | | |
| | |
| | | |
| | | 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"); |
| | | } |