![]() |
|
Модераторы: xvr |
![]()
|
|
| Alkash |
|
||||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
Доброго времени суток господа, возникла небольшая проблема. Возможно с пониманием вопроса. Есть программа, которая слушает сокет - и при получении какой-либо информации - делает некие действия. Она выполняется в потоке main. Так же есть 2 подпрограммы: таймер и мордочка на xlib к нему, которые призваны - показывать отсчет времени, если на сокет придет необходимая директива с количеством времени. Подпрограммы имеют следующие методы:
Если в данной последовательности выполнить их в main - то замечательно работает все, время добавляется, отсчитывается, отображается - красота. Однако - необходимо в main выполнять сокетную рутину, а эти методы засунуть в отдельный поток. В отдельный поток пытаюсь поместить следующим способом:
-------------------- Подпись >> /dev/null |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
arg нигде не используется? |
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
- Но ведь это означает, что сигфолт у Вас ЗА (!!!) joint...
А точнее, вот здесь :
Ну и повтыкайте там кучу контрольных печатей, что бы выяснить более детально - где именно сигфолт происходит... А насчет "отлаженного и работающего|" - не надо так горячиться! ;-) |
|||
|
||||
| Alkash |
|
||||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
Да нет же-)) Сегфолт - происходит, либо из-за необработки какого-то сигнала, либо - из-за window_loop. Потому как после - там идет чтение и разбор конфига, создание и обслуживание сокета, etc.
Собственно таймер:
метод window_loop:
Это сообщение отредактировал(а) Alkash - 15.3.2012, 08:11 -------------------- Подпись >> /dev/null |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| Alkash |
|
||||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
Метод называется: timer_add_time, приведен выше-)
Прикрутил поток обработки сигналов,
- теперь известно, что все падает вот тут:
Вопрос - на чем оно тут может гипотетически падать с interrupt system call, и главное - как это победить? Это сообщение отредактировал(а) Alkash - 15.3.2012, 15:03 -------------------- Подпись >> /dev/null |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| Alkash |
|
|||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
Прям вот в этой месте. Добавлено через 1 минуту и 26 секунд Второе падение - при вызове window_repaint_send(), в строке XSendEvent(display, window, 0, ExposureMask, (XEvent *) &expose);. -------------------- Подпись >> /dev/null |
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Если под "Сегфолт" Вы понимаете : SIGSEGV 11 /* Segmentation violation (ANSI). */ То происходит оно по одной-единственной причине : Ошибка адресации, вызванная некорректным указателем или некорректным индексом массива. И все ! Больше никаких причин нет и быть не может. Но, не так уж и важно, чем вызвано прерывание. А важно - ГДЕ оно возникает. А теперь, смотрим на Ваш код : Когда срабатывает вызов pthread_joint(...), он НЕ ПУСКАЕТ поток управления через себя. И прерывание не происходит. Когда Вы комментарите вызов pthred_joint , поток управления проходит сквозь него и натыкается на ОШИБКУ В ПРОГРАММЕ, приводящую к прерыванию и расположенную НИЖЕ этого вызова. |
|||
|
||||
| Alkash |
|
|||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
Однако - если удалить строки с потоком - то никакого сигфолта. Сокет создается, слушается, принимает - отдает. Я чего-то видимо упускаю... -------------------- Подпись >> /dev/null |
|||
|
||||
| Alkash |
|
|||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
обедив прошлую проблему с помощью XLockDisplay, XUnlockDisplay. Таймер бодренько отрабатывает, окошко бодренько прорисовывается. Но где-то я косякнул, и - работают только потоки.
Сокет - создается, слушается. Но - ничего не принимает, второе приложение - с ним соединяется - и все. Не ответа, ни привета. В чем может быть затык? -------------------- Подпись >> /dev/null |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Тут падать не на чем
Проверьте, что вы передаете в expose. И попробуйте сделать эту переменную статической (на всякий случай) Замысловато у вас подключение и чтение сокетов сделано. accept срабатывает? |
|||
|
||||
| Alkash |
|
|||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
1) Проблема была во множественном подключении к display. Мне помог XLockDisplay XUnlockDisplay. 2) Отрабатывает, но...Спустя длительное время. Например отправил на сокет
При том, что если потоки снести из main, то сокетная часть работает на ура. Это сообщение отредактировал(а) Alkash - 16.3.2012, 11:14 -------------------- Подпись >> /dev/null |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Странно. А у вас никакой поток случайно 100% CPU не съел? И еще попробуйте убрать pthread_sigmask, может с сигналами что то не то (хотя на сокеты они влиять не должны) |
|||
|
||||
| Alkash |
|
||||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
В system monitor висит как в ожидании, памяти отжирает 240 килобайт. В top - 80% проца свободно. На всякий случай привожу полный код window.c и timer.c
window.c
timer.c
-------------------- Подпись >> /dev/null |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |