The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

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

Модель организована следующим образом:
1)Форкаю процесс
2)В основном цикле вызываю функцию start()
3)функция start()в дополнительном цикле соединяется с сервером, получает данные, разрывает соединение и выходит из дополнительного цикла
4)Программа переходит в основной цикл, засыпает на 30 сек и снова вызывает функцию start()...

Привожу код программы:

#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 MAXSTRLEN 512
#define MAXRCVLEN 500
#define PORTNUM 8566

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);
/*************************************/

main(){
    daemonize();
    log_message(LOG_FILE, "Daemon is started");
        
    while(1){
    /* Печатаем шапку дебага */
    debug_begin();
    /* Подключаемся HSD серверу */
    start();
    
    //log_message(LOG_FILE, "Проверка работы !!!");
    /* Выводим чо-нибудь для контроля */
    log_message(LOG_FILE, strerror(errno));
    /* Делаем паузу X секунд */
    sleep(30);
    }    
}

/* Функция соединения с HSD сервером */
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) {
    /* Запускаем HSD Server */
    system ("/var/server/bin/run_hsd.sh & 2>&1");
    /* Ждём запуска HSD 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 = (char*) malloc (MAXSTRLEN + 1);
        int bytes = snprintf(stroka, MAXSTRLEN, "ACKN 1 %s\r\n", &buffer[15]);
        if (bytes > MAXSTRLEN) {
        /* Освобождаем память */
        free(stroka);
        log_message(LOG_FILE, "Error -->>> No free memory!");
        return;
        }
        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
    {
        log_message(LOG_FILE, strerror(errno));
        debug_mess(DBG_FILE, " <<->>", buffer);
        /* Закрываем сокет */
        close(mysocket);
        /* Выходим из цикла */
        break;
    }
    
    //log_message(LOG_FILE, buffer);
    
    //sleep(1);
    }    

}

/* Функция записи в сокет */
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){
struct timeval timenow;
FILE *logfile;
    /* функция времени */
    gettimeofday(&timenow, NULL);
    logfile=fopen(filename,"a");
    if(!logfile) return;
    fprintf(logfile,"%s        %s\r\n", message, ctime(&timenow.tv_sec));
    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 */
}


Помогите разобраться, где закралась ошибка, что я делаю не правильно...?

Думал может организовать модель так, чтоб соединение с сервером висело постоянно, но как проверять перед опросом, не отвалилось ли соединение или не разорвал ли его сервер???

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру