| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > поток лочится в open(filename, 0666) |
| Автор: InvalidProperty 20.11.2007, 13:13 | ||||
| В общем проблема следующего характера: есть демон, который сразу же после своего создания создает поток, который сразу же отсоединяется - этот поток будет следить за обращением других процессов по пайпу, т.е. будет ждать запрос. Демон работает с сокетами и, когда подключается новый клиент, создается для него отдельный поток, который так же отсоединяется, информация о tid и дескрипторе соединения сохраняется в векторе. Если демон запустить с параметром "-c", то по именованному пайпу передается запрос на вывод всей информации из вектора запущенного демона. Запущенный демон получает эту информацию и по другому именованному пайпу отправляет ответ-строку, содержащую требуемую информацию. Это в идеале... Вся проблема в том, что если демон стартует и тут же запустить процесс с аргументом командной строки "-c", то выводится информация о пустом векторе - что есть логично - но, если сначала законнектить клиента, стартует новый поток, который сразу же ловит segmentation violation, умирает, но дескриптор соединения специально не закрывается и информация об умершем потоке специально не удаляется из вектора, основной поток и поток слежения за пайпом остаются в живых, запускается процесс с параметром "-c" и все... Описание работы потока слежения:
CTERM - терминатор, введенный искусственно для разделения данных. Описание работы клиента
все помечено комментариями. Еще раз повторюсь. Если демон стартовать и сразу же запустить еще один процесс с параметром "-c" - все прекрасно работает, т.е. выводится информация о пустом векторе, если же демон запустить и подконнектить к нему клиента, поток которого сразу же умрет по SIGSEGV, то демон залочится в open() на чтении |
| Автор: InvalidProperty 21.11.2007, 09:27 | ||||||||
В том то и дело, что 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, действующий на один поток следующим образом:
и отсоединенный поток, следящий за пайпом? где логика? |
| Автор: MAKCim 21.11.2007, 13:40 |
| InvalidProperty, выложи весь код, а то по кускам я не могу составить полную картину происходящего |
| Автор: InvalidProperty 21.11.2007, 16:34 |
| MAKCim, ссори, не могу весь... весь весит 200 кило... я подумаю еще самостоятельно над проблемой и, если что, то напишу |