0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4

Таймер прерывает чтение из fifo

19.05.2014, 04:07. Показов 1243. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Столкнулся с такой проблемой. Есть программа сервера, управление которым производится посредством именованного канала. Т.е. основную часть времени он висит в функции open() в заблокированном состоянии. Когда я с клиента пишу что-нибудь канал - сервер просыпается, выполняет что нужно, закрывает канал и снова блокируется в open(). И это работает. Также я хочу, чтобы сервер еще каждую секунду выполнял некое действие. С помощью sigaction() привязываю обработчик к сигналу SIGALRM. С помощью setitimer() стартую таймер. Сам по себе таймер тоже прекрасно работает. Но если пытаюсь запустить это все вместе, то таймер срывает блокировку сервера, и все вылетает. Пишет, что не может открыть канал. Была идея для таймера другой поток выделить, но это глупость. Обработчики у всех потоков одни и те же будут. А дочерний процесс ради таймера - вообще неспортивно. Подскажите, почему он так плохо себя вести может?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2014, 04:07
Ответы с готовыми решениями:

Список FIFO и чтение из файла
Пытаюсь реализовать частотный словарь (посчитать частоту встречи слова в тексте) #include "stdafx.h" #include...

Чтение из FIFO и запись в обычный файл
Я считываю видеопоток из сети с помощью libvlc и записываю в файл, но мне нужно зашифровать его перед записью в реальном времени. Для этого...

Return не прерывает функцию
Добрый день! Имеется некоторая функция, при получении переменной $find_alt значения true, я ожидаю, что функция прервется и вернет значение...

2
19.05.2014, 10:35

Не по теме:

Эм... Можно как-то висеть в функции open? В мане опций для этого не нашел. И до наступления какого события? Не понимаю.

0
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4
19.05.2014, 14:34  [ТС]
I/O on pipes and FIFOs
The only difference between pipes and FIFOs is the manner in which
they are created and opened. Once these tasks have been
accomplished, I/O on pipes and FIFOs has exactly the same semantics.

If a process attempts to read from an empty pipe, then read(2) will
block until data is available. If a process attempts to write to a
full pipe (see below), then write(2) blocks until sufficient data has
been read from the pipe to allow the write to complete. Nonblocking
I/O is possible by using the fcntl(2) F_SETFL operation to enable the
O_NONBLOCK open file status flag.
http://man7.org/linux/man-pages/man7/pipe.7.html
Вот это уже странно. Написано, что в read() висеть должен. Но у меня, честное слово, он висит в open() почему-то.

Добавлено через 15 минут
Если при открытии FIFO через open() не указать режим O_NONBLOCK, то открытие FIFO блокируется и для записи, и для чтения. При записи канал блокируется до тех пор, пока другой процесс не откроет FIFO для чтения. При чтении канал снова блокируется до тех пор, пока другой процесс не запишет данные.
http://www.opennet.ru/docs/RUS... ode17.html
А вот здесь написано уже так, как у меня. Что блокируется именно открытие, а не чтение. Ну у меня работает именно так. А с таймером вообще ничего не блокируется, просто не открывает канал.

Добавлено через 1 час 50 минут
РЕШЕНО!!!
Всем спасибо, сам уже нашел. Напишу решение, вдруг пригодится кому.
По умолчанию в Linux сигнал не прерывает системный вызов. read продолжит чтение и при поступлении данных вернется в программу. Для изменения такого поведения есть вызов siginterrupt. Просто напишите (до read)

siginterrupt(SIGALRM,1);
Это разрешает прерывание системного вызова и после него (прерванного) Вы получите errno == EINTR. Кстати, если вместо signal вызывать sigaction и явно не устанавливать флаг SA_RESTART в поле .sa_flags, то вызовы будут прерываться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2014, 14:34
Помогаю со студенческими работами здесь

Is_dir прерывает цикл
Здравствуйте. Сейчас учусь и возникла задача написать функцию, которая обходит каталоги и подкаталоги. Как писать, сам алгоритм, понял. Но,...

wi-fi роутер прерывает передачу пакетов
Доброго времени суток! У меня такая ситуация, есть модем dlink 2540u, раздающий инет автоматически, "не мостом"? и к нему...

ADSL модем прерывает соединение
Иногда пропадает интернет. Бывает по разному: на пять минут или на несколько часов. Звонил провайдеру, они сказали все нормально работает....

QDialog setVisible прерывает exec?
Добрый вечер форумчане! Столкнулся с такой проблемой - имеется диалог в нем инкапсулирован другой диалог, при нажатии на кнопку первого -...

mobile partner периодически прерывает соединение
Всем здравствуйте. Читал здесь похожие проблемы, но у меня иное. У меня обычный GPRS модем. Стоит сим карта МТС. Периодически отключается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru