Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4

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

19.05.2014, 04:07. Показов 1239. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru