Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2009, 12:44   #1
qazaqazaq
 
Регистрация: 08.10.2008
Сообщений: 4
По умолчанию Не стабильная работа процесса на СИ под UNIX...

Добрый день, не могу понять в чём проблема, написал процесс на СИ под UNIX, всё стабильно и правильно работает, контролирую по логфайлу(каждые 30 секунд в файл пишется информация)
Но почему-то есть замирания на 1 час иногда на 30 мин, потом работа снова продолжается. И так постоянно. Посоветуйте, что может быть. Программа по средством сокета опрашивает сервер, каждые 30 секунд.
Привожу код программы:
Код:
#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);
	}	

}

Последний раз редактировалось qazaqazaq; 23.02.2009 в 16:29.
qazaqazaq вне форума Ответить с цитированием
Старый 23.02.2009, 12:46   #2
qazaqazaq
 
Регистрация: 08.10.2008
Сообщений: 4
По умолчанию

Продолжение кода, прошу прощения, что не во вложении, просто так удобнее смотреть код...

Код:
/* Функция записи в сокет */
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 */
}
Помогите разобраться, а то чтот не могу сообразить, всегда писал на PHP, а тут вот нужно на СИ
qazaqazaq вне форума Ответить с цитированием
Старый 23.02.2009, 19:31   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Процесс вы скопировали -
Код:
 i=fork();
Ему нужно задавать исполняемый файл при помощи функции exec
MaTBeu вне форума Ответить с цитированием
Старый 23.02.2009, 22:07   #4
qazaqazaq
 
Регистрация: 08.10.2008
Сообщений: 4
Вопрос Не стабильная работа процесса на СИ под UNIX...

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Ему нужно задавать исполняемый файл при помощи функции exec
Спасибо за ответ, но я не совсем понял, какой исполняемый файл, зачем? Подскажите пожалуйста подробнее, я первый раз пишу на Си...
qazaqazaq вне форума Ответить с цитированием
Старый 23.02.2009, 23:29   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Смотрите в линуксе только первый процесс в системе создается по-особенному. Все остальные процессы копируются функцией fork(), а потом им "приклеивают" исполняемый код функцией exec().

К сожалению параметров я не помню, посмотрите в гугле по поводу этих функций. И еще вот вам ссылочка Первые шаги в Си под Линукс.
MaTBeu вне форума Ответить с цитированием
Старый 24.02.2009, 01:06   #6
qazaqazaq
 
Регистрация: 08.10.2008
Сообщений: 4
По умолчанию

На сколько я понимаю exec() запускает другую программу в созданном процессе. Мне это не нужно мне нужно выполнять свою программу...
Вот собственно пример:
http://masters.donntu.edu.ua/2005/fv...rogramming.pdf

Похоже не в этом счастье...
qazaqazaq вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с памятью процесса JRcoker Win Api 10 18.07.2009 22:22
работа под ограниченным профилем kos1nus Помощь студентам 6 14.12.2008 13:04
Запуск процесса под другим пользователем Андреy Win Api 3 03.12.2008 17:57
Написание простого инсталлятора под UNIX zina2008 Фриланс 1 21.10.2008 09:08