Не стабильная работа процесса на СИ под UNIX...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qazaqq, 23 Feb 2009.

  1. qazaqq

    qazaqq New Member

    Joined:
    23 Feb 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Добрый день, не могу понять в чём проблема, написал процесс на СИ под UNIX, всё стабильно и правильно работает, контролирую по логфайлу(каждые 30 секунд в файл пишется информация)
    Но почему-то есть замирания на 1 час иногда на 30 мин, потом работа снова продолжается. И так постоянно. Я новичёк в программировании на СИ, да ещё и под UNIX, посоветуйте, что может быть, может где-то переменные нужно очищать или с памятью что-то вылазит...
    Программа по средством сокета опрашивает сервер, каждые 30 секунд.
    Привожу код программы:
    Code:
    /*
    cc -lsocket -o demon demon.c
    ./demon
    ps -ef|grep demon (or ps -aux on BSD systems)
    */
    #include <sys/time.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    
    #include <errno.h>
    #include <string.h>
    
    #define RUNNING_DIR	"/var/temp/my/@"
    #define LOCK_FILE	"log_d.pid"
    #define LOG_FILE	"log_d.log"
    #define DBG_FILE	"log_d.dbg"
    
    #define MAXRCVLEN 500
    #define PORTNUM 8533
    
    extern int errno;
    
    /* Объявляем фукции */
    void start(void);
    void debug_begin(void);
    void daemonize(void);
    void debug_mess(char *filename, char *from, char *message);
    void log_message(char *filename, char *message);
    void write_s(int mysocket, char *data);
    char *util_base64_encode(char *txt);
    void send_email(char *message);
    /*************************************/
    
    main(){
    	daemonize();
    	log_message(LOG_FILE, "Daemon is started :");
    		
    	while(1){
    	/* Печатаем шапку дебага */
    	debug_begin();
    	/* Подключаемся к серверу */
    	start();
    	/* Выводим чо-нибудь для контроля */
    	log_message(LOG_FILE, "Проверка работы процесса !");
    	/* Делаем паузу 30 секунд */
    	sleep(30);
    	}	
    }
    
    /* Функция соединения с сервером */
    void start(void){
    int flag = 0;
    int len, mysocket, result;
    struct sockaddr_in dest; 
    char buffer[MAXRCVLEN + 1];
    
    	/* Создаем сокет */
        mysocket = socket(AF_INET, SOCK_STREAM, 0);
    	
    	memset(&dest, 0, sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_addr.s_addr = inet_addr("10.65.10.20"); 			/* set destination IP number */ 
        dest.sin_port = htons(PORTNUM);                				/* set destination port number */
    	
    	/* Пытаемся установить соединение с сервером */
    	if ((connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr))) < 0) {
    	/* Запускаем Server */
    	system ("/opt/bin/run_server.sh & 2>&1");
    	/* Ждём запуска Servera */
    	sleep(5);
    	/* Соединяемся с сервером */
    	connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr));
    	} 
    	/* else */
    	while(1){
    
    	/* Читаем данные от сервера */
    	result = recv(mysocket, buffer, MAXRCVLEN, 0);
    	
    	/* Исключаем символ окончания строки */
    	buffer[result] = '\0';
    	
    	if(strcmp(buffer, "ACKN\n")==0 && flag == 0)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, "HELO\r\n");
    	} else if(strcmp(buffer, "ACKN\n")==0 && flag == 1)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, "EXEC\r\n");
    		flag = 2;
    	} else if(strcmp(buffer, "ACKN\n")==0 && flag == 2)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		flag = 3;
    	} else if(strncmp(buffer, "ACKN HSD Server", 15)==0)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, "INIT ALARM_SUMMARY\r\n");
    		flag = 1;
    	} else if(strcmp(buffer, "RSLT ALARM_SUMMARY\n")==0 || strcmp(buffer, "PARA SNAPSHOT\n")==0 || strncmp(buffer, "VALU", 4)==0 || strncmp(buffer, "VALR", 4)==0 || strcmp(buffer, "ETBL\n")==0)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, "ACKN\r\n");
    	} else if(strncmp(buffer, "TABL SUMMARY 6 ", 15)==0)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Определяем количество строк в таблице ошибок */
    		char stroka[] = "ACKN 1 ";
    		/* Приводим к виду: stroka = "TABL SUMMARY 6 X.." */
    		strcat(stroka, &buffer[15]);
    		/* Приводим к виду: stroka = "TABL SUMMARY 6 X..\r\n" */
    		strcat(stroka, "\r\n");
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, stroka);
    	} else if(strcmp(buffer, "QUIT\n")==0)
    	{
    		debug_mess(DBG_FILE, " <--- ", buffer);
    		/* Отправляем сообщение серверу */
    		write_s(mysocket, "ACKN\r\n");
    		/* Закрываем сокет */
    		close(mysocket);
    		/* Выходим из цикла */
    		break;
    	} else
    	{
    		debug_mess(DBG_FILE, " <<->>", buffer);
    		/* Закрываем сокет */
    		close(mysocket);
    		/* Выходим из цикла */
    		break;
    	}
    	
    	log_message(LOG_FILE, buffer);
    	
    	usleep(10);
    	}	
    
    }
    
    /* Функция записи в сокет */
    void write_s(int mysocket, char *data){
    write(mysocket, data, strlen(data));
    debug_mess(DBG_FILE, " ---> ", data);
    }
    
    /* Функция шапки дебага */
    void debug_begin(void){
    struct timeval timenow;
    FILE *debugfile;
    	/* функция времени */
    	gettimeofday(&timenow, NULL);
    	debugfile = fopen(DBG_FILE, "a");
    	if(!debugfile) return;
    	fprintf(debugfile,"%s", "##########################   ");
    	fprintf(debugfile,"%s", ctime(&timenow.tv_sec));
    	fprintf(debugfile,"%s\r\n", "   ##########################");
    	fclose(debugfile);
    }
    
    /* Функция дебага демона */
    void debug_mess(char *filename, char *from, char *message){
    FILE *debugfile;
    	debugfile = fopen(filename, "a");
    	if(!debugfile) return;
    	fprintf(debugfile,"%s %s\r\n", from, message);
    	fclose(debugfile);
    }
    
    /* Функция логирования сообщений демона */
    void log_message(char *filename, char *message){
    FILE *logfile;
    	logfile=fopen(filename,"a");
    	if(!logfile) return;
    	fprintf(logfile,"%s\r\n", message);
    	fclose(logfile);
    }
    
    /* Функция обработки сигналов */
    void signal_handler(int sig){
    	switch(sig) {
    	case SIGHUP:
    		log_message(LOG_FILE,"hangup signal catched");
    		break;
    	case SIGTERM:
    		log_message(LOG_FILE,"Daemon is killed :");
    		exit(0);
    		break;
    	}
    }
    
    /* Функция демона */
    void daemonize(){
    int i,lfp;
    char str[10];
    	if(getppid()==1) return; /* already a daemon */
    	i=fork();
    	if (i<0) exit(1); /* fork error */
    	if (i>0) exit(0); /* parent exits */
    	/* child (daemon) continues */
    	setsid(); /* obtain a new process group */
    	for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
    	i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
    	umask(027); /* set newly created file permissions */
    	chdir(RUNNING_DIR); /* change running directory */
    	lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
    	if (lfp<0) exit(1); /* can not open */
    	if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
    	/* first instance continues */
    	sprintf(str,"%d\n",getpid());
    	write(lfp,str,strlen(str)); /* record pid to lockfile */
    	signal(SIGCHLD,SIG_IGN); /* ignore child */
    	signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
    	signal(SIGTTOU,SIG_IGN);
    	signal(SIGTTIN,SIG_IGN);
    	signal(SIGHUP,signal_handler); /* catch hangup signal */
    	signal(SIGTERM,signal_handler); /* catch kill signal */
    }
    :confused: :confused: :confused:
     
    #1 qazaqq, 23 Feb 2009
    Last edited: 23 Feb 2009