![]() |
|
Модераторы: xvr |
![]()
|
|
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
Доброе время суток.
Нужна помощь по теме. Проблема в принципе похожа на "читателя-писателя". Есть текстовый файл. В нем какая-то информация. С файлом работает несколько процессов читателей и 1 процесс –писатель. Читатели читают из файла. А писатель с клавиатуры файл "обновляет". Когда работат писатель, то ни один другой процесс работать не может, но процессы читатели могут работать вместе (параллельно). Задачу решить нужно с помощью fcntl(). Нужен приблизительный пример такой конструкции. Заранее благодарю. |
|||
|
||||
| RasenHerz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
Функция fcntl() использюется в пяти различных случаях:
1) Создание дубликата существующего дескриптора 2) Получение/установка флагов дескриптора 3) Получение/установка флагов состояния файла 4) Проверка/установка владельца для асинхронных операций IO 5) Получение/установка блокировки на отдельную запись в файле Решение поставленной тобой задачи использованием одной лишь ф-цией fcntl() хоть и возможно. но думаю излишне мудрено(она ведь всего лишь меняет "св-ва" уже открытого файла. т.е. тебе надо лишь "грамотно" открыть файл, а там уже дело техники:
после выполнения всех этих операций делаешь форк, создаешь порожденные процессы(они унаследуют все дескрипторы открытых файлов) и можешь не беспокоится: файл будет нормально использоваться в многопоточных приложениях. =) |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Добавлено через 2 минуты и 30 секунд RasenHerz, O_SYNC испольуется не для синхронизации -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
MAKCim, ага, большое спасибо. Я примерно так и пытался сделать, но я не додумался устанавливать блокировку чтения перед собственно чтением
|
|||
|
||||
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
Гм..
очень странно, что как только в функцию reader я добавляю какие-либо действия по считыванию из файла, как походу писатель полностью игнорируется. Например:
Т.е. добавление любых действий по чтению или записи (с файлом или с консолью) в reader() отправляет читателя в бесконечный цикл, а "писатель" writer() вообще игнорируется... Это сообщение отредактировал(а) Xonxt - 30.3.2008, 12:26 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Xonxt, а ты lock снять после чтения не забываешь?
|
|||
|
||||
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
Конечно нет! Я же просто фрагмент привел...
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
паузу поставь перед тем, как лочить будешь. А потом, добавь опцию O_SYNC в писатель, а то пока буфер не сбросится, данные не обновятся на диске (другие процессы не увидят их).
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
bsa,
кэш файла не зависит от процесса (структуры struct file) страница кэша, в которой храняться данные, будет в любом случае обновляться при любой попытке записи поэтому чтение будет происходить из кэша O_SYNC здесь вообще не причем Это сообщение отредактировал(а) MAKCim - 30.3.2008, 13:12 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
странно. Вот запускаю что-то через nohup и смотрю с помощью tail -f, так вывод дается рывками (поблочно). Или это особенность nohup? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
что запускаешь? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Например:
Думаю, что раз вывод происходит в файл, а не терминал, то реакции на \n (сброс буфера) характерной для терминалов нет. Поэтому вывод производится по мере заполнения буфера... |
||||
|
|||||
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
Гмм...
Ув. MAKCim, можно ли попросить Вас в приведенном Вами выше примере кода вставить реальные примеры чтения и записи. В reader() текст читается из файла и выводится на экран, а в writer() - считыается с клавиатуры и записыается в файл. А то что-то программа на этих моментах тормозит (читай, уходит в бесконечный цикл). Added: и вообще, походу при каждом новом запуске программы оно выдает разные результаты... Наверное, из-за того, что каждый раз процессы отрабатывают в разном порядке... Вот сейчас только что программа отработала как положено! А в следующий раз - опять reader() ушел в бесконечный цикл... Это сообщение отредактировал(а) Xonxt - 30.3.2008, 14:11 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Xonxt,
файл вначале пустой или содержит какие-либо данные? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Xonxt |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 24.1.2006 Где: Украина / Одесса Репутация: нет Всего: 1 |
Изначально содержит данные.
Похоже, что для того, чтобы реализовать еще и ввод текста с клавиатуры, надо делать процессы не fork'ом, а просто отдельными приложениями... Это сообщение отредактировал(а) Xonxt - 30.3.2008, 14:46 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |