The OpenNET Project / Index page

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



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

Исходное сообщение
"Не стабильная работа демона на СИ под UNIX..."
Отправлено Skip, 01-Мрт-09 12:52 
Попробовал просто добавить строгости в исходник, но толком проверить логику сейчас времени нету. Можешь diff'ом посмотреть изменения и протестировать работу, вдруг помогло:

#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 <time.h>
#include <sys/stat.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(const char *filename, const char *from, const char *message);
void log_message(const char *filename, const char *message);
void write_s(int mysocket, const char *data);
/*************************************/

int main(void)
{
    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);
    }

    return 0;
}

/* Функция соединения с HSD сервером */
void start(void)
{
    int flag = 0;
    int mysocket, result;
    struct sockaddr_in dest;
    char buffer[MAXRCVLEN + 1];

    /* Создаем сокет */
    mysocket = socket(AF_INET, SOCK_STREAM, 0);
    if (mysocket == -1) return;

    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);
        /* Соединяемся с сервером */
        if (connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == -1) return;
    }
    /* else */
    while(1){

        /* Читаем данные от сервера */
        memset(buffer, 0, MAXRCVLEN + 1);
        result = recv(mysocket, buffer, MAXRCVLEN, 0);
        if (result == -1) return;

        /* Исключаем символ окончания строки */
        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 = NULL;
            int bytes;

            stroka = (char *)malloc(MAXSTRLEN + 1);
            if (stroka == NULL) return;
            memset(stroka, 0, MAXSTRLEN + 1);

            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);
            free(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;
        }
    }
}

/* Функция записи в сокет */
void write_s(int mysocket, const char *data)
{
    write(mysocket, data, strlen(data));
    debug_mess(DBG_FILE, " ---> ", data);
}

/* Функция шапки дебага */
void debug_begin(void)
{
    struct timeval timenow;
    FILE *debugfile = NULL;

    /* функция времени */
    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(const char *filename, const char *from, const char *message)
{
    FILE *debugfile = NULL;

    debugfile = fopen(filename, "a");
    if(!debugfile) return;

    fprintf(debugfile, "%s %s\r\n", from, message);
    fclose(debugfile);
}

/* Функция логирования сообщений демона */
void log_message(const char *filename, const char *message)
{
    struct timeval timenow;
    FILE *logfile = NULL;

    /* функция времени */
    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(void)
{
    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);
    if (i < 0) exit(1);

    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 */
    memset(str, 0, 10);
    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
Добавить, Поддержать, Вебмастеру