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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2015, 10:46   #1
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию C, linux pipe

Имеется pipe-файл, который создается в читающем его потоке
Код:
mkfifo(PIPENAME,0777)
далее открывается на чтение
Код:
fifoFile = open(PIPENAME,O_RDONLY)
после чего стартует бесконечный цикл
Код:
do {
 if ((len = read(fifoFile,&my_struct,sizeof(my_struct))) <= 0) {
  usleep(100);
  continue;
} else {
 //обработка считанного
}
} while (1)
Собственно если читать нечего - цикл гоняется через usleep. Хочется открыть файл таким образом, чтобы read отрабатывал только при поступлении данных в файл. В манах указан флаг O_SYNC, но он блокирует вызывающий (записывающий) процесс, что совершенно не нужно, поскольку писать в pipe-файл могут несколько процессов.

Еще раз вопрос: что читать/как это сделать?

upd:
если убрать присваивание
Код:
len = read ...
то какая-то фигня получается.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)

Последний раз редактировалось Vanta11a; 16.03.2015 в 10:53.
Vanta11a вне форума Ответить с цитированием
Старый 17.03.2015, 17:47   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Все мануалы, которые я нашел, говорят, что функция read() применительно к pipe`у должна приостановить свое выполнение до тех пор, пока не появятся данные для чтения. В реальности же функция упорно читает пустоту.

WTF?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 18.03.2015, 07:45   #3
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Сам задал вопрос, сам отвечаю.

Если pipe-файл не открыт на запись, то функция read возвращает 0 (конец файла). В моем случае файл периодически открывается процессом на запись, в него запихиваются данные и файл закрывается. Соответственно read в тот момент, когда файл не открыт, возвращает 0.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)

Последний раз редактировалось Vanta11a; 18.03.2015 в 07:52.
Vanta11a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pipe,конвеер[c] MariaD Помощь студентам 0 25.12.2014 12:09
pipe,конвеер[c] MariaD Помощь студентам 0 14.12.2014 21:27
pipe sukharef Общие вопросы C/C++ 4 21.06.2013 13:13
пытаюсь разобраться с pipe, (linux,c++) Egyptorium Общие вопросы C/C++ 4 10.01.2013 02:12
использование named Pipe Sparky Общие вопросы .NET 1 29.03.2010 17:54