Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Не стабильная работа процесса на СИ под UNIX... (https://forum.antichat.xyz/showthread.php?t=107623)

qazaqq 23.02.2009 17:15

Не стабильная работа процесса на СИ под UNIX...
 
Добрый день, не могу понять в чём проблема, написал процесс на СИ под UNIX, всё стабильно и правильно работает, контролирую по логфайлу(каждые 30 секунд в файл пишется информация)
Но почему-то есть замирания на 1 час иногда на 30 мин, потом работа снова продолжается. И так постоянно. Я новичёк в программировании на СИ, да ещё и под UNIX, посоветуйте, что может быть, может где-то переменные нужно очищать или с памятью что-то вылазит...
Программа по средством сокета опрашивает сервер, каждые 30 секунд.
Привожу код программы:
Код:

/*
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:


Время: 03:18