qazaqq
23.02.2009, 17:15
Добрый день, не могу понять в чём проблема, написал процесс на СИ под 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:
Но почему-то есть замирания на 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: