프로그램이 이유 없이 죽어버립니다.
글쓴이: blue39 / 작성시간: 월, 2005/08/29 - 3:38오후
안녕하세요~
회사에서 필요해서 DDNS기능을 하는 작은 데몬을 하나 만들었습
니다. 기능은 정상적으로 동작하는데 문제는 이 데몬이 이유없이
죽어버리는 겁니다. 띄우고 얼마 후에 바로 죽는 문제가 아니고 최
소한 2시간 후에 죽더군요. 죽을 경우에는 어떠한 시스템 메시지를
띄우지도 안습니다. 코드 상에도 특별히 죽을 것(?) 같은 동작은 없
는데 참 이상합니다. 코드를 첨부하니 한 번씩 보시고 조언 좀 부탁
드립니다. 그럼 환절기에 건강 조심하세요 ^^
#define SERVER_PORT 20202 #define LISTEN_QUEUE 10 int main(int argc, char *argv[]) { FILE *zone_file, *tmp_file, *log_file; time_t time_val; pid_t child_pid; int listen_sock, conn_sock, read_count, not_match = 1, process_cnt = 0; socklen_t cli_len; struct sockaddr_in server_addr, cliaddr; char recv_addr[20], recv_buf[30], file_buf[256]; char temp[50]; if(daemon(0, 0) < 0) printf("Daemon Error!"); time(&time_val); log_file = fopen("ddns.log", "a"); fprintf(log_file, "Server Start Time : %s\n", ctime(&time_val)); fclose(log_file); listen_sock = socket(AF_INET, SOCK_STREAM, 0); memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); listen(listen_sock, LISTEN_QUEUE); while(1) { conn_sock = accept(listen_sock, (struct sockaddr *)&cliaddr, &cli_len); read(conn_sock, recv_buf, sizeof(recv_buf)); zone_file = fopen("jmp.zone", "r"); tmp_file = fopen("tmp.zone", "w"); while(fgets(file_buf, sizeof(file_buf), zone_file) != NULL) { if(strncmp(recv_buf, file_buf, strlen(recv_buf)) == 0) { fprintf(tmp_file, "%s IN A %s\n", recv_buf, inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, recv_addr, sizeof(recv_addr))); not_match = 0; } else fprintf(tmp_file, file_buf); } if(not_match) fprintf(tmp_file, "%s IN A %s\n", recv_buf, inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, recv_addr, sizeof(recv_addr))); not_match = 1; time(&time_val); log_file = fopen("ddns.log", "a"); fprintf(log_file, "%d HostName : %s, IP : %s, Time : %s\n", process_cnt++, recv_buf, inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, recv_addr, sizeof(recv_addr)), ctime(&time_val)); fclose(log_file); fclose(zone_file); fclose(tmp_file); close(conn_sock); system("mv jmp.zone jmp.zone.bak\n"); system("mv tmp.zone jmp.zone\n"); system("/usr/sbin/rndc -p 953 reload\n"); memset(recv_buf, 0, sizeof(recv_buf)); } time(&time_val); log_file = fopen("ddns.log", "a"); fprintf(log_file, "Server Stop Time : %s\n", ctime(&time_val)); fclose(log_file); }
Forums:
메모리 문제일 걸로 생각되는 군요 :)
메모리 문제일 걸로 생각되는 군요 :)
문제가 될만한 코드라면fprintf(tmp_file, file_buf
문제가 될만한 코드라면
fprintf(tmp_file, file_buf);
정도가 보이네요. file_buf의 내용에따라 죽을수 있습니다.
fputs(file_buf, tmp_file);
로 바꾸어서 테스트 해보세요.
댓글 달기