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

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);
로 바꾸어서 테스트 해보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.