![]() |
|
Модераторы: xvr |
![]()
|
|
| Anark1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
Здравствуйте,
подзадача - между клиентом и сервером организован именованный канал и очередь сообщений, очередь сообщений для синхронизации, канал - для передачи данных. В клиенте формируется команда (например edit, подразумевающая отправку серверу введенные с клавиатуры данные), далее клиент пишет в канал. Собственно проблема. В самый первый раз все прекрасно работает, клиент пишет, сервер читает, но уже второй раз происходит блокировка.
Все структуры сообщений и константы описаны и работа с очередью выполняется корректно На сервере функционируют несколько процессов, которым нужно передать считанные данные, это реализуется через неименованные каналы, также для внутренней синхронизации используется другая очередь сообщений. Это не имеет прямого отношения к проблеме, написал это для дополнения картины.
fd - массив дескрипторов неименованных каналов. Непонятно вообще почему происходит блокировка. И интересно, что если открывать канал в клиенте с флагом O_NONBLOCK то результат такой же. Уже слегка замучался, буду очень благодарен. Это сообщение отредактировал(а) Anark1 - 17.12.2009, 02:29 |
||||
|
|||||
| Anark1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
Странные вещи происходят. Немного продвинулся в решении проблемы. Оказывается при второй итерации цикла в очередь просто не отправляются\не читаются сообщения. Интересный момент, если выполнить вторую команду (сервер повисает, не может получить это сообщение), потом аварийно "убить" сервер и заново его запустить, то автоматически срабатывает та команда которая должна была быть выполнена в прошлый раз (на которой сервер повис).
Я уже совсем не понимаю как такое возможно. |
|||
|
||||
| svlary |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
У Вас запись в канал происходит вот столько раз :
А чтение - вот столько :
Почти на 100% уверен, что число запросов на ЧТЕНИЕ превышает число ЗАПИСЕЙ. Вот Ваш сервер и виснет - на запросе чтения. |
||||
|
|||||
| Anark1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
svlary,
я уже написал, что первый запрос проходит нормально и все читается как нужно. А то что вы привели, это все хорошо. Посмотрите код ниже. Поле размером height*width. Разбивается на полосы, их число wrk_count, высота у всех height, а ширина всех кроме последней wrk_def. У последней полосы ширина wrk_last (так как разбиение может быть неравномерным).
так что тут все в порядке Это сообщение отредактировал(а) Anark1 - 17.12.2009, 10:08 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
посмотрите через strace -f, на чем зависает программа и что к этому приводит
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anark1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
Провозился, все сводится видимо к некорректности работы очереди сообщений. Эту тему наверное можно закрывать.
|
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
||||
|
||||
| Anark1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
Я намекаю на то, что в cygwin IPC ресурсы реализованы не лучшим образом. У меня не очень большой опыт написания программ под Unix, однако уверен, что мои огрехи виноваты в меньшей степени. Перепроверив код миллион раз в конечном итоге я установил виртуальную машину с FreeBSD. Под FreeBSD все работало корректно, причем код не менял. А косяков в cygwinе было полно. Висела очередь при обмене сообщениями разных размеров, необъяснимые блокировки FIFO (не знаю при чем тут FIFO), при удалении/добавлении назад некоторых операторов взаимодействия с IPC, не влияющих на дальнейшую работу программы иногда вылетало что-то вроеде fork: child хххх - died waiting for dll loading, которое работало до этого. Погуглил на этот счет, не у меня одного такие проблемы. Стоило сразу ставить виртуалку, сэкномоил бы кучу времени и сил. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Anark1,
винить cygwin нужно винить только в очень крайнем случае ;) 99% что ошибка у вас -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |