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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2010, 21:25   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию FIFO файлы

Доброго времени суток уважаемые эксперты.
Разбираюсь с FIFO файлами в Linux, и наткнулся на одну проблему
Реализовал такую вещь: две программы (главная и дочерняя). При запуске, главная программа создает FIFO файл и ожидает подключения к нему дочернего приложения. После подключения дочерней программы, главная поочередно передает в FIFO файл 3 строки. Дочерняя принимает строки, выводит их на экран, и ищет самую длинную из них.

Теперь вопрос: в главной программе пишу вот так:
Введите строку: HelloWorld
Введите строку: Clear
Введите строку: HelpMe

На выходе дочернего приложения получаю так:
Размер буфера: 512
Пришла строка: HelloWorld
Пришла строка: ClearWorld
Пришла строка: HelpMeorld

Самая длиная строка: HelloWorld
Сперва грешил на то, что при передаче, в строке нет '\0', но, после каждого ввода/вывода я заполнял строку '\0' - не помогло
Теперь подозреваю то, что где-то существует промежуточный буфер, который не очищается. Вот как-то так.
Код прилагается:
Главная программа:
Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const BufLength = 512;

int main()
{
	int fd;
	int StrCount = 0;
	char *StrIn = malloc(BufLength*sizeof(char));
	char name[]="FIFOFile";
	umask(0);
	if(mkfifo(name, S_IFIFO | 0666) < 0){
		printf("Невозможно создать FIFO файл\n");
		return -1;
	} else{
		if((fd = open(name, O_WRONLY)) < 0){
			printf("Невозможно открыть FIFO файл\n");
			return -1;
		} else {
			write(fd,&BufLength,sizeof(int));
			while (StrCount++ < 3){
				printf("Введите строку: ");
				scanf("%s",StrIn);
				write(fd,StrIn,strlen(StrIn));
			}
			close(fd);
		}
	}
	return 0;
}
Дочерняя программа:
Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int fd;
	int StrCount = 0;
	int BufLength;
	char *StrOut;
	char *StrTmp;
	char name[]="FIFOFile";
	umask(0);
	if((fd = open(name, O_RDONLY)) < 0){
		printf("Невозможно открыть FIFO файл\n");
		return -1;
	} else {
		if (sizeof(int) == read(fd,&BufLength,sizeof(int))){
			StrOut = malloc(BufLength*sizeof(char));
			StrTmp = malloc(BufLength*sizeof(char));
			printf("Размер буфера: %d\n",BufLength);
			while (StrCount++ < 3){
				if (read(fd,StrOut,BufLength) > strlen(StrTmp)){
					free(StrTmp);
					StrTmp = strdup(StrOut);
				}
				printf("Пришла строка: %s\n",StrOut);
			}
			printf("\nСамая длиная строка: %s\n",StrTmp);
			close(fd);
		}
	}
	return 0;
}
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 26.04.2010, 00:33   #2
silent_1991
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 68
По умолчанию

Вашу основную программу можно оставить без изменений.
Дочернюю же программу предлагаю дополнить так:
Код:
int n; //Размер строки, которую приняла функция read из FIFO

.............................................................................................

while (StrCount++ < 3){
		n = read(fd,StrOut,BufLength); // Читаем сообщение из FIFO
		StrOut[n] = '\0';              // Дополняем принятую строку символом \0
		if (n > strlen(StrTmp)){
		    free(StrTmp);
		    StrTmp = strdup(StrOut);
		}
		printf("Пришла строка: %s\n",StrOut);
	    }
silent_1991 вне форума Ответить с цитированием
Старый 26.04.2010, 09:07   #3
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

А кто будет освобождать выделенную память?
+ strdup может вызывать дополнительные утечки памяти.
oleg kutkov вне форума Ответить с цитированием
Старый 26.04.2010, 10:20   #4
silent_1991
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 68
По умолчанию

oleg kutkov,
Если вы это мне, то возлагаю эту ответственность на топикстартера))) Я сделал так, чтобы строки правильно считывались и выводились на экран.
silent_1991 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
файлы Scofield8 Фриланс 7 05.02.2010 15:48
файлы в Си серг Общие вопросы C/C++ 11 03.02.2010 19:23
Файлы dragun4ik Помощь студентам 1 01.02.2010 21:56
Файлы. BR@BUS Помощь студентам 5 09.04.2008 19:35
два вредных вопроса:про асю и прикриплёные файлы файлы steck Свободное общение 3 17.06.2007 14:53