Skip to content
Snippets Groups Projects
Commit 3cb20139 authored by smoh's avatar smoh
Browse files

modify

parent 3f8ae4d4
No related branches found
No related tags found
No related merge requests found
...@@ -26,11 +26,11 @@ void DetachSharedMemory(); ...@@ -26,11 +26,11 @@ void DetachSharedMemory();
void CloseMessageQueue(); void CloseMessageQueue();
void SendMessage(char *name); void SendMessage(char *name);
void InitializeSignal();
// 종료 시그널 핸들러 Ctrl + C, Stop Command // 종료 시그널 핸들러 Ctrl + C, Stop Command
void SIGINT_Handler(int signo); void SIGINT_Handler(int signo);
void SIGUSR1_Handler(int signo); void SIGUSR1_Handler(int signo);
void SIGTERM_Handler(int signo); void SIGUSR2_Handler(int signo);
int shared_memory_id = 0; int shared_memory_id = 0;
int msg_queue_id = 0; int msg_queue_id = 0;
void *pShemBuffer = NULL; void *pShemBuffer = NULL;
...@@ -41,12 +41,6 @@ msgBuf buf; ...@@ -41,12 +41,6 @@ msgBuf buf;
int main(int argc, char *argv[]) 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) if(argc != 2)
{ {
printf("you must input one argument\n"); printf("you must input one argument\n");
...@@ -59,6 +53,8 @@ int main(int argc, char *argv[]) ...@@ -59,6 +53,8 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
InitializeSignal();
memset(&buf, 0, sizeof(buf)); memset(&buf, 0, sizeof(buf));
ConnectSharedMemory(&shared_memory_id, &pShemBuffer); ConnectSharedMemory(&shared_memory_id, &pShemBuffer);
...@@ -70,7 +66,7 @@ int main(int argc, char *argv[]) ...@@ -70,7 +66,7 @@ int main(int argc, char *argv[])
SendMessage(argv[1]); SendMessage(argv[1]);
CloseMessageQueue(); CloseMessageQueue();
DetachSharedMemory(); DetachSharedMemory();
return 0; return 0;
...@@ -195,6 +191,7 @@ void SendMessage(char *name) ...@@ -195,6 +191,7 @@ void SendMessage(char *name)
} }
} }
} }
void SIGINT_Handler(int signo) void SIGINT_Handler(int signo)
{ {
SharedData *pSharedData = (SharedData*)pShemBuffer; SharedData *pSharedData = (SharedData*)pShemBuffer;
...@@ -218,11 +215,12 @@ void SIGINT_Handler(int signo) ...@@ -218,11 +215,12 @@ void SIGINT_Handler(int signo)
pSharedData->pData[0] = pSharedData->pData[1]; pSharedData->pData[0] = pSharedData->pData[1];
} }
pSharedData->numOfProcess--; pSharedData->numOfProcess--;
kill(pSharedData->Server.pid, SIGUSR2); kill(pSharedData->Server.pid, SIGUSR2);
DetachSharedMemory(); DetachSharedMemory();
CloseMessageQueue();
} }
void CloseMessageQueue() void CloseMessageQueue()
...@@ -235,13 +233,9 @@ void CloseMessageQueue() ...@@ -235,13 +233,9 @@ void CloseMessageQueue()
exit(1); exit(1);
} }
} }
else
{
}
} }
void SIGTERM_Handler(int signo) void SIGUSR2_Handler(int signo)
{ {
msgBuf buf; msgBuf buf;
int rcvMsgType = (msgTypeIndex == 1)? 2 : 1; int rcvMsgType = (msgTypeIndex == 1)? 2 : 1;
...@@ -253,3 +247,24 @@ void SIGTERM_Handler(int signo) ...@@ -253,3 +247,24 @@ void SIGTERM_Handler(int signo)
printf("[%s] %s\n", buf.name, buf.text); 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);
}
}
...@@ -6,15 +6,20 @@ ...@@ -6,15 +6,20 @@
#include <string.h> #include <string.h>
#include "common.h" #include "common.h"
void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer); void CreateSharedMemory();
void SIGINT_Handler(int); void DeleteSharedmemory();
void SIGUSR1_Handler(int); void InitializeSignal();
void SIGINT_Handler(int signo);
void SIGUSR1_Handler(int signo);
int shared_memory_id = 0; int shared_memory_id = 0;
void *pShemBuffer = NULL; void *pShemBuffer = NULL;
int isReceivedSIGINT = FALSE;
int main(void) int main(void)
{ {
InitializeSignal();
CreateSharedMemory(&shared_memory_id, &pShemBuffer); CreateSharedMemory(&shared_memory_id, &pShemBuffer);
SharedData sharedData; SharedData sharedData;
...@@ -29,50 +34,34 @@ int main(void) ...@@ -29,50 +34,34 @@ int main(void)
printf("%d\n", shared_memory_id); printf("%d\n", shared_memory_id);
while(1) while(!isReceivedSIGINT)
{
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))
{ {
fprintf(stderr, "shmctl error\n");
exit(1);
} }
DeleteSharedMemory();
return 0; 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"); fprintf(stderr, "shmget error\nn");
exit(1); 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"); printf("Shared Memory Buffer Create Failed...\n");
exit(1); exit(1);
...@@ -81,11 +70,54 @@ void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer) ...@@ -81,11 +70,54 @@ void CreateSharedMemory(int *sharedMemoryId, void** pShemBuffer)
void SIGINT_Handler(int signo) void SIGINT_Handler(int signo)
{ {
isReceivedSIGINT = TRUE;
} }
void SIGUSR1_Handler(int signo) 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);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment