프로그램이 이유 없이 죽어버립니다.
글쓴이: 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);
로 바꾸어서 테스트 해보세요.
댓글 달기