![]() |
|
Модераторы: xvr |
![]()
|
|
| InvalidProperty |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
В общем проблема следующего характера:
есть демон, который сразу же после своего создания создает поток, который сразу же отсоединяется - этот поток будет следить за обращением других процессов по пайпу, т.е. будет ждать запрос. Демон работает с сокетами и, когда подключается новый клиент, создается для него отдельный поток, который так же отсоединяется, информация о tid и дескрипторе соединения сохраняется в векторе. Если демон запустить с параметром "-c", то по именованному пайпу передается запрос на вывод всей информации из вектора запущенного демона. Запущенный демон получает эту информацию и по другому именованному пайпу отправляет ответ-строку, содержащую требуемую информацию. Это в идеале... Вся проблема в том, что если демон стартует и тут же запустить процесс с аргументом командной строки "-c", то выводится информация о пустом векторе - что есть логично - но, если сначала законнектить клиента, стартует новый поток, который сразу же ловит segmentation violation, умирает, но дескриптор соединения специально не закрывается и информация об умершем потоке специально не удаляется из вектора, основной поток и поток слежения за пайпом остаются в живых, запускается процесс с параметром "-c" и все... Описание работы потока слежения:
CTERM - терминатор, введенный искусственно для разделения данных. Описание работы клиента
все помечено комментариями. Еще раз повторюсь. Если демон стартовать и сразу же запустить еще один процесс с параметром "-c" - все прекрасно работает, т.е. выводится информация о пустом векторе, если же демон запустить и подконнектить к нему клиента, поток которого сразу же умрет по SIGSEGV, то демон залочится в open() на чтении -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
какое значение тут имеет errno? что выдает perror(NULL) перед return -1? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| InvalidProperty |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
В том то и дело, что errno там не имеет никакого значения, ибо именно на if( (this->pipe_request_fd = open(PIPE_REQUEST_FILE, O_RDONLY)) == -1) поток и лочится. В принципе, я разобрался частично с этой проблемой, но так и не понял до конца, почему происходила блокировка отсоединенного потока. В общем, проблема заключалась в следующем:
так вот... места, где происходит неувязка отмечены знаком "(1)". дело в том, что когда мы создаем новый экземпляр threadDaemonsData для нового потока и кладем в его поле pos_master итератор конца в векторе masterDaemon.children, то этот итератор так же благополучно и изменяется, как изменяется сам вектор различными потоками. Я этого не учитывал и, когда в деструкторе уничтожался элемент вектора masterDaemon.children по итератору threadDaemonsData->pos_master, то этот итератор указывал уже неизвестно куда и, как следствие, я получал SIGSEGV. Но все-таки, я до конца не понимаю... При чем тут SIGSEGV, действующий на один поток следующим образом:
и отсоединенный поток, следящий за пайпом? где логика? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
InvalidProperty,
выложи весь код, а то по кускам я не могу составить полную картину происходящего -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
MAKCim,
ссори, не могу весь... весь весит 200 кило... я подумаю еще самостоятельно над проблемой и, если что, то напишу -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |