From 3cb201396183d8fd8d8a0f2c88b74b0b448c095e Mon Sep 17 00:00:00 2001 From: smoh Date: Mon, 16 Mar 2020 17:28:10 +0900 Subject: [PATCH] modify --- SimpleChatting/client.c | 49 +++++++++++++------- SimpleChatting/server.c | 100 ++++++++++++++++++++++++++-------------- 2 files changed, 98 insertions(+), 51 deletions(-) diff --git a/SimpleChatting/client.c b/SimpleChatting/client.c index 8c2e804..d01f3e1 100644 --- a/SimpleChatting/client.c +++ b/SimpleChatting/client.c @@ -26,11 +26,11 @@ void DetachSharedMemory(); void CloseMessageQueue(); void SendMessage(char *name); +void InitializeSignal(); // 종료 시그널 핸들러 Ctrl + C, Stop Command void SIGINT_Handler(int signo); void SIGUSR1_Handler(int signo); -void SIGTERM_Handler(int signo); - +void SIGUSR2_Handler(int signo); int shared_memory_id = 0; int msg_queue_id = 0; void *pShemBuffer = NULL; @@ -41,12 +41,6 @@ msgBuf buf; int main(int argc, char *argv[]) { - if(signal(SIGTERM, SIGTERM_Handler) == SIG_ERR) - { - fprintf(stderr, "cannot handle SIGTERM\n"); - exit(EXIT_FAILURE); - } - if(argc != 2) { printf("you must input one argument\n"); @@ -59,6 +53,8 @@ int main(int argc, char *argv[]) exit(1); } + InitializeSignal(); + memset(&buf, 0, sizeof(buf)); ConnectSharedMemory(&shared_memory_id, &pShemBuffer); @@ -70,7 +66,7 @@ int main(int argc, char *argv[]) SendMessage(argv[1]); CloseMessageQueue(); - + DetachSharedMemory(); return 0; @@ -195,6 +191,7 @@ void SendMessage(char *name) } } } + void SIGINT_Handler(int signo) { SharedData *pSharedData = (SharedData*)pShemBuffer; @@ -218,11 +215,12 @@ void SIGINT_Handler(int signo) pSharedData->pData[0] = pSharedData->pData[1]; } - pSharedData->numOfProcess--; - + pSharedData->numOfProcess--; kill(pSharedData->Server.pid, SIGUSR2); - DetachSharedMemory(); + DetachSharedMemory(); + + CloseMessageQueue(); } void CloseMessageQueue() @@ -235,13 +233,9 @@ void CloseMessageQueue() exit(1); } } - else - { - - } } -void SIGTERM_Handler(int signo) +void SIGUSR2_Handler(int signo) { msgBuf buf; int rcvMsgType = (msgTypeIndex == 1)? 2 : 1; @@ -253,3 +247,24 @@ void SIGTERM_Handler(int signo) printf("[%s] %s\n", buf.name, buf.text); } } + +void InitializeSignal() +{ + if(signal(SIGINT, SIGINT_Handler) == SIG_ERR) + { + fprintf(stderr, "cannot handle SIGINT\n"); + exit(EXIT_FAILURE); + } + + if(signal(SIGUSR1, SIGUSR1_Handler) == SIG_ERR) + { + fprintf(stderr, "cannot handle SIGUSR1\n"); + exit(EXIT_FAILURE); + } + + if(signal(SIGUSR2_Handler) == SIG_ERR) + { + fprintf(stderr, "cannot handler SIGUSR2\n"); + exit(EXIT_FAILURE); + } +} diff --git a/SimpleChatting/server.c b/SimpleChatting/server.c index 912538f..d22f12b 100644 --- a/SimpleChatting/server.c +++ b/SimpleChatting/server.c @@ -6,15 +6,20 @@ #include #include "common.h" -void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer); -void SIGINT_Handler(int); -void SIGUSR1_Handler(int); +void CreateSharedMemory(); +void DeleteSharedmemory(); +void InitializeSignal(); +void SIGINT_Handler(int signo); +void SIGUSR1_Handler(int signo); int shared_memory_id = 0; void *pShemBuffer = NULL; +int isReceivedSIGINT = FALSE; int main(void) -{ +{ + InitializeSignal(); + CreateSharedMemory(&shared_memory_id, &pShemBuffer); SharedData sharedData; @@ -29,50 +34,34 @@ int main(void) printf("%d\n", shared_memory_id); - while(1) - { - sleep(2); - SharedData* pData = (SharedData*)pShemBuffer; - - printf("processNumber : %d\n", pData->numOfProcess); - - if(pData->numOfProcess > 0) - { - printf("%d %s %d\n", pData->pData[0].pid, pData->pData[0].name, pData->pData[0].isExist); - // break; - } - } - - if(shmdt(pShemBuffer) == -1) - { - fprintf(stderr, "shmdt error\n"); - exit(1); - } - - if(-1 == shmctl(shared_memory_id, IPC_RMID, 0)) + while(!isReceivedSIGINT) { - fprintf(stderr, "shmctl error\n"); - exit(1); } - + DeleteSharedMemory(); return 0; } -void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer) +void CreateSharedMemory() { - *sharedMemoryId = shmget(g_SharedMemoryKey, SHARED_MEMORY_SIZE, 0644 | IPC_CREAT); + shared_memory_id = shmget(g_SharedMemoryKey, SHARED_MEMORY_SIZE, 0644 | IPC_CREAT | IPC_EXCL); + + if(EEXIST == shared_memory_id) + { + fprintf(stderr, "server already exists\n"); + exit(1); + } - if(-1 == *sharedMemoryId) + if(-1 == shared_memory_id) { fprintf(stderr, "shmget error\nn"); exit(1); } - *pShemBuffer = shmat(*sharedMemoryId, NULL, 0); + pShemBuffer = shmat(shared_memory_id, NULL, 0); - if((void*)-1 == *pShemBuffer) + if((void*)-1 == pShemBuffer) { printf("Shared Memory Buffer Create Failed...\n"); exit(1); @@ -81,11 +70,54 @@ void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer) void SIGINT_Handler(int signo) { - + isReceivedSIGINT = TRUE; } void SIGUSR1_Handler(int signo) { + SharedData *pSharedData = (SharedData*)pShemBuffer; + + if(NULL == pSharedData) + { + fprintf(stderr, "SharedData is NULL\n"); + exit(1); + } + + int index = pSharedData->numOfProcess - 1; + printf("# [%s] has entered. #\n", pSharedData->pData[index].name); + + if(pSharedData->numOfProcess == 2) + { + } +} +void DeleteSharedMemory() +{ + if(-1 == shmdt(pShemBuffer)) + { + fprintf(stderr, "shmdt error\n"); + exit(1); + } + + if(-1 == shmctl(shared_memory_id, IPC_RMID, 0)) + { + fprintf(stderr, "shmctl error\n"); + exit(1); + } +} + +void InitializeSignal() +{ + if(SIG_ERR == signal(SIGINT, SIGINT_Handler)) + { + fprintf(stderr, "cannot handler SIGINT\n"); + exit(EXIT_FAILURE); + } + + if(SIG_ERR == signal(SIGUSR1, SIGUSR1_Handler)) + { + fprintf(stderr, "cannot handler SIGUSR1\n"); + exit(EXIT_FAILURE); + } } -- GitLab