Добрый день, не могу понять в чём проблема, написал процесс на СИ под 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 */ }