소켓통신 질문이야 SIG핸들러~부분인데 ㅠ0ㅠ

qodwlql의 이미지

소스상에 이렇게 되있습니다.
SIGTERM 부분이 이해가안되는데요 무슨뜻인지 해석이 잘안됩니다.

signal(SIGCLD, SIG_IGN);
signal(SIGTERM, TerminateRoutin);
signal(SIGHUP, SIG_IGN);

TerminateRoutin 이부분은 함수인데

void TerminateRoutin(int i)
{
if (iOwn_Socket_Start_Flag == TRUE) {
close(iOwn_Socket_Id);
}

if (iClient_Socket_Start_Flag == TRUE) {
close(iClient_Socket_Id);
}

if (iService_Socket_Start_Flag == TRUE) {
close(iService_Socket_Id);
}

exit(0);
}
이렇게 되있습니다.

또 반복문을 돌려서
소켓accept 를 하고 포크를 생성하는데
exit란 강제종료를 하고
마지막 부분에 또 close를 하는데 이 while 문이 잘 이해가 되질않네요 ㅠㅠ
while(1) {
iClient_Socket_Start_Flag = iService_Socket_Start_Flag = FALSE;
if ((iClient_Socket_Id = accept(iOwn_Socket_Id, (struct sockaddr *)&stClient_Socket_Addr, &iClient_Socket_Addr_Len)) < 0) {
LogWrite(szProgram_Name, "accept() Error.", iClient_Socket_Id);
continue;
}

iClient_Socket_Start_Flag = TRUE;

if (fork() == 0) {
LogWrite(szProgram_Name, "fork() Start.", 0);

SocketServiceRouting(iClient_Socket_Id);

LogWrite(szProgram_Name, "fork() End.", 0);

close(iClient_Socket_Id); <-- 요부분 (여기서 close를 했는데 또 밑에서 클로즈를 하네요 ㅠㅠ그이유가멀가요?
if (iService_Socket_Start_Flag == TRUE) { <-- 요부분
close(iService_Socket_Id); <-- 요부분
}

exit(0);
}

close(iClient_Socket_Id); <-- 요부분
}