프로그램이 이유 없이 죽어버립니다.

blue39의 이미지

안녕하세요~

회사에서 필요해서 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);
}
욱성군의 이미지

메모리 문제일 걸로 생각되는 군요 :)

익명 사용자의 이미지

문제가 될만한 코드라면
fprintf(tmp_file, file_buf);
정도가 보이네요. file_buf의 내용에따라 죽을수 있습니다.
fputs(file_buf, tmp_file);
로 바꾸어서 테스트 해보세요.