madf 279 Опубликовано: 2008-04-27 14:03:03 Share Опубликовано: 2008-04-27 14:03:03 ...Как вообще код СТЖ попадает в перехватчик сигналов ????? У меня при такой реализации код вообще не выходил из главного цикла при SIGINT например......А тупо прерывался где хотел. Ибо не понятно какя именно нить получит сигнал. Или что то я не понимаю..... А что касается того что я говорил: Для неотделенного (PTHREAD_CREATE_JOINABLE) потока очень важно, чтобы после того, как он завершится, к нему присоединился другой поток, - иначе ресурсы этого потока не будут освобождены для использования новыми потоками. Это обычно приводит к утечке памяти. Если не требуется создавать поток, который будет присоединен, нужно создавать его ОТДЕЛЬНЫМ. вообщем спорить здесь нечего - у меня все завелось и работает в отличие от СТЖ а разработчику советую поссмотреть в сторону sigwait и в сторону отключаемых потоков и еще поссмотри здесь. Думаю здесь самое правильно решение http://damao.net/vhosts/node.to/sigtest.tgz а то что завелся одиночный поток - это еще не показатель. По первому. Перехватчики сигналов определены в main.cpp. В частности, CatchTERM: void CatchTERM(int sig) { /* *Function Name:CatchINT *Parameters: sig_num - номер сигнала *Description: Обработчик сигнала INT *Returns: Ничего */ STG_LOGGER & WriteServLog = GetStgLogger(); WriteServLog("Shutting down... %d", sig); //nonstop = false; nonstop.Stop(__FILE__, __LINE__); struct sigaction newsa, oldsa; sigset_t sigmask; sigemptyset(&sigmask); sigaddset(&sigmask, SIGTERM); newsa.sa_handler = SIG_IGN; newsa.sa_mask = sigmask; newsa.sa_flags = 0; sigaction(SIGTERM, &newsa, &oldsa); sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); newsa.sa_handler = SIG_IGN; newsa.sa_mask = sigmask; newsa.sa_flags = 0; sigaction(SIGINT, &newsa, &oldsa); } отвечает за обработкe сигналов SIGTERM и SIGINT: /////// sigemptyset(&sigmask); sigaddset(&sigmask, SIGTERM); newsa.sa_handler = CatchTERM; newsa.sa_mask = sigmask; newsa.sa_flags = 0; sigaction(SIGTERM, &newsa, &oldsa); ... /////// sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); newsa.sa_handler = CatchTERM; newsa.sa_mask = sigmask; newsa.sa_flags = 0; sigaction(SIGINT, &newsa, &oldsa); Приводит к останову главноого цикла: while (nonstop.GetStatus()) { if (needRulesReloading) { needRulesReloading = false; traffCnt->Reload(); } stgUsleep(100000); } За которым следует код остановки всех подсистем. Все порождаемые stg нити работают от старта до останова системы. По этому, даже если после их завершения остались неосвобожденные ресурсы (тут я согласен, по документации joinable threads оставляют ресурсы до pthread_join) - они буду освобождены ОС, т.к. после останова потоков программа завершает свою работу. Да, во многих потоках которые блокируются на прослушке порта останов реализован посылом dummy packet. Хорошее или плохое это решение - хз. Ничем не хуже посыла потоку сигнала (pthread_kill), который приведет к снятию блокировки с возвратом -1 и errno = EINTR. Ссылка на сообщение Поделиться на других сайтах
stg-34 0 Опубликовано: 2008-04-27 14:05:36 Share Опубликовано: 2008-04-27 14:05:36 Или что то я не понимаю..... Именно. Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-04-27 14:27:47 Share Опубликовано: 2008-04-27 14:27:47 Упертость хороша вещь ))) 6 лет ведь уже баги ловим можно здесь, например, прочитать http://www.rsdn.ru/Forum/message/2890085.flat.aspx Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-04-27 14:40:58 Share Опубликовано: 2008-04-27 14:40:58 to madf, stg34 СОВЕТУЮ ПРОЧЕСТЬ http://publib.boulder.ibm.com/infocenter/s...cNode=int_14825 Обработчики сигналов и маски сигналов Обработчики сигналов относятся к уровню процесса. Для ожидания сигналов настоятельно рекомендуется применять функцию sigwait. Функцию sigaction применять не рекомендуется, так как список обработчиков сигналов хранится на уровне процесса, и любая нить процесса может изменять его. Если две нити указали один и тот же сигнал в обработчике сигналов, то вторая нить, вызвавшая функцию sigaction, переопределит параметры, заданные первой нитью; предсказать порядок, в котором будут выполняться нити, в общем случае невозможно. Маски сигналов обслуживаются на уровне нитей. У каждой нити может быть свой набор сигналов, доставку которых она заблокирует. Для работы с маской сигналов вызывающей нити следует применять функцию sigthreadmask. Функцию sigprocmask не следует применять в программах с несколькими нитями - это может привести к непредсказуемым результатам. Функция pthread_sigmask во многом схожа с функцией sigprocmask. Параметры и способы применения обеих функций одинаковы. При преобразовании существующей программы в версию с поддержкой библиотеки нитей функцию sigprocmask можно заменить на pthread_sigmask. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-04-27 14:51:12 Share Опубликовано: 2008-04-27 14:51:12 1. На RSDN все написано верно. 2. В цитате все написано верно. Проблема заключается в том, что ты действительно, видимо, не понимаеш, как работает Stargazer. На самом деле все просто. Обработчик сигналов у нас 1 на все приложение, а не для каждой нити. Практически все нити "висят" на блокирующем read. Также есть главный цикл, который раз в 100 мс проверяет необходимость перезагрузки правил. Когда происходит прерывание по сигналу - вызывается обработчик. В како нити это произошло - не важно. Обработчик работает с глобальным объектом nonstop: //----------------------------------------------------------------------------- class STG_STOPPER { public: STG_STOPPER() { nonstop = true; } bool GetStatus() { return nonstop; }; void Stop(const char * __file__, int __line__) { #ifdef NO_DAEMON printfd(__FILE__, "Stg stopped at %s:%d\n", __file__, __line__); #endif nonstop = false; } private: bool nonstop; }; //----------------------------------------------------------------------------- STG_STOPPER nonstop; //----------------------------------------------------------------------------- После вызова метода Stop этого объекта обработчик завершает свою работу и управление передается обратно в точку прерывания. Максимум через 100 мс главный цикл проверит условие выхода (в нем нет блокирующих вызовов) и завершится. После этого начинается процесс останова системы, который обсудили выше (dummy packets vs. pthread_kill). По поводу необходимости вызова pthread_join я уже писал выше: потоки создаются 1 раз (при старте программы) и завершаются 1 раз (при останове). Утечки памяти не происходит. Я не вижу никаких потиворечий в обработке сигналов с тем, что написано по указанным тобой ссылкам. И не понимаю, почему ты считаеш, что Stargazer не может работать. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-04-27 14:52:14 Share Опубликовано: 2008-04-27 14:52:14 2Stiff: баг подтвержден. Ошибка в конфигураторе. Поправляем. Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-04-27 15:06:38 Share Опубликовано: 2008-04-27 15:06:38 И не понимаю, почему ты считаеш, что Stargazer не может работать. Он и не работает - когда делаешь kill процессу. Кто сказал что он работает? В файлах нули, в фиреберде мусор. Еще раз повторюсь ОС FreeBSD 6.3 Если бы писали как рекомендует RSDN - я бы тему не поднимал Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-04-27 15:24:45 Share Опубликовано: 2008-04-27 15:24:45 Скорее всего потому что за 5 сек не успевает сохраниться инфа в базе. Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-04-27 15:29:11 Share Опубликовано: 2008-04-27 15:29:11 Скорее всего потому что за 5 сек не успевает сохраниться инфа в базе. И всеж пересмотрите работу с потоками., а именно обработчик сигналов. PS BPF подправили? Ссылка на сообщение Поделиться на других сайтах
stg-34 0 Опубликовано: 2008-04-28 06:56:15 Share Опубликовано: 2008-04-28 06:56:15 А что касается глюков fork и POSIX Threads - может все дело не в "старых ядрах", а в не умелом использовании нитей. ;-) Учить матчасть, и только потом философствовать о потоках. Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-04-28 08:24:51 Share Опубликовано: 2008-04-28 08:24:51 А что касается глюков fork и POSIX Threads - может все дело не в "старых ядрах", а в не умелом использовании нитей. ;-) Учить матчасть, и только потом философствовать о потоках. Учитесь прислушиваться )) У меня с мат частью все нормально. Я на потоки убил очень много времении и в своем приложении сделал так как все нужно, как книжка пишет. а вам еще раз следует прочитать Обработчики сигналов и маски сигналов Обработчики сигналов относятся к уровню процесса. Для ожидания сигналов настоятельно рекомендуется применять функцию sigwait. Функцию sigaction применять не рекомендуется, так как список обработчиков сигналов хранится на уровне процесса, и любая нить процесса может изменять его. Если две нити указали один и тот же сигнал в обработчике сигналов, то вторая нить, вызвавшая функцию sigaction, переопределит параметры, заданные первой нитью; предсказать порядок, в котором будут выполняться нити, в общем случае невозможно. Маски сигналов обслуживаются на уровне нитей. У каждой нити может быть свой набор сигналов, доставку которых она заблокирует. Для работы с маской сигналов вызывающей нити следует применять функцию sigthreadmask. Функцию sigprocmask не следует применять в программах с несколькими нитями - это может привести к непредсказуемым результатам. Функция pthread_sigmask во многом схожа с функцией sigprocmask. Параметры и способы применения обеих функций одинаковы. При преобразовании существующей программы в версию с поддержкой библиотеки нитей функцию sigprocmask можно заменить на pthread_sigmask. Ссылка на сообщение Поделиться на других сайтах
Smeet 0 Опубликовано: 2008-04-28 15:31:13 Share Опубликовано: 2008-04-28 15:31:13 Попытался запустить конвертор, вот что пишет: ./convertor main.cpp > 23:26:19 > Start main.cpp > 23:26:19 > Importing admins: main.cpp > 23:26:19 > - admin main.cpp > 23:26:19 > Importing tariffs: main.cpp > 23:26:19 > - tariff main.cpp > 23:26:19 > Importing services: main.cpp > 23:26:19 > Importing corporations: main.cpp > 23:26:19 > Importing users: main.cpp > 23:26:19 > - test main.cpp > 23:26:19 > (adding passed) convertor in free(): error: chunk is already free Abort (core dumped) Ссылка на сообщение Поделиться на других сайтах
tvpKS 0 Опубликовано: 2008-04-28 18:47:56 Share Опубликовано: 2008-04-28 18:47:56 попробуй этой штучкой http://local.com.ua/forum/index.php?showtopic=11291 только тарифы заведи сначала - эта штука только юзеров переносит - зато без багов )))) так как то что ты написал - быть такого не может ))) Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-04-29 10:57:37 Share Опубликовано: 2008-04-29 10:57:37 Попытался запустить конвертор, вот что пишет:./convertor main.cpp > 23:26:19 > Start main.cpp > 23:26:19 > Importing admins: main.cpp > 23:26:19 > - admin main.cpp > 23:26:19 > Importing tariffs: main.cpp > 23:26:19 > - tariff main.cpp > 23:26:19 > Importing services: main.cpp > 23:26:19 > Importing corporations: main.cpp > 23:26:19 > Importing users: main.cpp > 23:26:19 > - test main.cpp > 23:26:19 > (adding passed) convertor in free(): error: chunk is already free Abort (core dumped) Откуда и куда конвертиш? Исходники, бинарники и корку, если не сложно, упакуй и закинь в faust@stg.dp.ua Ссылка на сообщение Поделиться на других сайтах
Smeet 0 Опубликовано: 2008-05-06 10:23:40 Share Опубликовано: 2008-05-06 10:23:40 2Stiff:баг подтвержден. Ошибка в конфигураторе. Поправляем. Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся... Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-05-06 10:31:20 Share Опубликовано: 2008-05-06 10:31:20 Нет пока Ссылка на сообщение Поделиться на других сайтах
Polo 0 Опубликовано: 2008-05-17 07:40:24 Share Опубликовано: 2008-05-17 07:40:24 Может немного не по теме но назрела необходимость. Нужно знать какой админ и с какого IP конектился конфигуратором а в логи стг это почемуто не ложит..... Вопрос почему????? (FreeBSD 6.0, stg-2.4-2007.01.06-15.46.32) Заранее спасибо! Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-05-18 06:08:05 Share Опубликовано: 2008-05-18 06:08:05 Не врите, молодой человек. /var/log/stargazer.log: 2008-02-19 16:53:00 -- Admin 'admin', 127.0.0.1: User 'test': 'IP' parameter changed from '10.0.0.10' to '192.168.1.17'. Уже как минимум год. А может и больше. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-05-18 06:09:20 Share Опубликовано: 2008-05-18 06:09:20 2Stiff:баг подтвержден. Ошибка в конфигураторе. Поправляем. Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся... sgconfig.1.90.9.win.exe Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубликовано: 2008-05-18 11:35:06 Share Опубликовано: 2008-05-18 11:35:06 2Stiff:баг подтвержден. Ошибка в конфигураторе. Поправляем. Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся... sgconfig.1.90.9.win.exe Можно ли узнать кой какую деталь..... Я так понимаю исходников "компонент" относящихся к старгейзеру более не будет? Проект переходит плавно в проект с закрытым кодом? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-05-18 11:37:01 Share Опубликовано: 2008-05-18 11:37:01 Надо - пиши - выложим Ни о каком закрытии речи не идет - это бессмысленно Ссылка на сообщение Поделиться на других сайтах
Pasha T. 0 Опубликовано: 2008-05-20 09:41:41 Share Опубликовано: 2008-05-20 09:41:41 Поправьте ссылку на новую версию stg-2.405 в новостях stargazer.dp.ua, там ссылка на старую. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубликовано: 2008-05-20 09:51:32 Share Опубликовано: 2008-05-20 09:51:32 Спасибо, пофиксим Ссылка на сообщение Поделиться на других сайтах
Smeet 0 Опубликовано: 2008-05-23 07:17:20 Share Опубликовано: 2008-05-23 07:17:20 версия 2.405 в логе высвечивается старая версия: 2008-05-23 08:17:19 -- Stg v. Stg 2.4042008-05-23 08:17:19 -- Message queue created successfully. msgKey=5555 msgID=589824 2008-05-23 08:17:19 -- Timer thread started successfully. 2008-05-23 08:17:19 -- Storage plugin: file_store v.1.02. Loading successfull. 2008-05-23 08:17:21 -- Users started successfully. в файле raw_ip_packet.h все так же неисправленно: inline uint32_t RAW_PACKET::GetLen() const из-за чего диверт считает мусорный ветер. за отключение детальной статистики - спасибо. Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубликовано: 2008-05-30 09:16:31 Share Опубликовано: 2008-05-30 09:16:31 Гента, 1,8 атлонХп, 256 рам, 40-50 юзеров. stg-2.405.9.8 валится вот с такими вот письменами (собран с дебагом): ping.cpp > 11:19:08 > pinger.DelIP 0.0.0.0 ping.cpp > 11:19:08 > pingerCurrIP.AddIP 10.0.0.78 user.cpp > 11:19:08 > USER::WriteStat user=Ibragim inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368 inetaccess.cpp > 11:19:08 > 1212131990.928739 368 bytes sent to 10.0.0.78:5555 len=368 inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008 inetaccess.cpp > 11:19:08 > recv from 10.0.1.133 5555 len=64 inetaccess.cpp > 11:19:08 > User OliaSh FOUND! inetaccess.cpp > 11:19:08 > ======================> InitEncrypt dont needed inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008 inetaccess.cpp > 11:19:08 > recv from 10.0.0.40 5555 len=64 inetaccess.cpp > 11:19:08 > User Tarubarova FOUND! inetaccess.cpp > 11:19:08 > ======================> InitEncrypt dont needed inetaccess.cpp > 11:19:08 > CONN_ACK inetaccess.cpp > 11:19:08 > rnd = 682568960 connAck->rnd=682568961 inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368 inetaccess.cpp > 11:19:08 > 1212131990.929062 368 bytes sent to 10.0.0.40:5555 len=368 inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008 inetaccess.cpp > 11:19:08 > recv from 10.0.3.13 5555 len=64 inetaccess.cpp > 11:19:08 > User trio FOUND! inetaccess.cpp > 11:19:08 > ======================> InitEncrypt dont needed inetaccess.cpp > 11:19:08 > CONN_ACK inetaccess.cpp > 11:19:08 > rnd = 116568813 connAck->rnd=116568814 inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368 inetaccess.cpp > 11:19:08 > 1212131990.930713 368 bytes sent to 10.0.3.13:5555 len=368 inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008 user.cpp > 11:19:08 > USER::WriteStat user=hellstad inetaccess.cpp > 11:19:08 > recv from 10.0.1.152 5555 len=64 inetaccess.cpp > 11:19:08 > User BarsovaA FOUND! inetaccess.cpp > 11:19:08 > ======================> InitEncrypt dont needed inetaccess.cpp > 11:19:08 > CONN_ACK inetaccess.cpp > 11:19:08 > rnd = 283691498 connAck->rnd=283691499 users.cpp > 11:19:08 > Add IP Idx traffcounter.cpp > 11:19:08 > AddUser: BarsovaA ping.cpp > 11:19:08 > pinger.DelIP 0.0.0.0 ping.cpp > 11:19:08 > pingerCurrIP.AddIP 10.0.1.152 Ошибка сегментирования В /var/log/stargazer.log следущее: 2008-05-29 20:53:35 -- Stg v. Stg 2.404 2008-05-29 20:53:35 -- Message queue created successfully. msgKey=5555 msgID=2031616 2008-05-29 20:53:35 -- Timer thread started successfully. 2008-05-29 20:53:35 -- Storage plugin: mysql_store v.0.67. Loading successfull. 2008-05-29 20:53:35 -- Users started successfully. 2008-05-29 20:53:35 -- Traffcounter started successfully. 2008-05-29 20:53:35 -- Module: 'ipq_cap v.1.1'. Start successfull. 0 2008-05-29 20:53:35 -- Module: 'InetAccess authorizator v.1.2'. Start successfull. 50 2008-05-29 20:53:35 -- Module: 'Always Online authorizator v.1.0'. Start successfull. 70 2008-05-29 20:53:37 -- Module: 'Pinger v.1.01'. Start successfull. 100 2008-05-29 20:53:37 -- Module: 'Stg configurator v.0.07'. Start successfull. 220 2008-05-29 20:53:37 -- Stg started successfully. 2008-05-29 20:53:37 -- +++++++++++++++++++++++++++++++++++++++++++++ 2008-05-30 09:29:56 -- User's connect failed. IP '10.0.0.29'. Wrong login or password 2008-05-30 10:29:44 -- User's connect failed. IP '10.0.0.81'. Wrong login or password 2008-05-30 11:35:41 -- Stg v. Stg 2.404 2008-05-30 11:35:41 -- Message queue created successfully. msgKey=5555 msgID=2064384 2008-05-30 11:35:41 -- Timer thread started successfully. 2008-05-30 11:35:41 -- Storage plugin: mysql_store v.0.67. Loading successfull. 2008-05-30 11:35:41 -- Users started successfully. 2008-05-30 11:35:41 -- Traffcounter started successfully. 2008-05-30 11:35:41 -- Module: 'ipq_cap v.1.1'. Start successfull. 0 2008-05-30 11:35:41 -- Module: 'InetAccess authorizator v.1.2'. Start successfull. 50 2008-05-30 11:35:41 -- Module: 'Always Online authorizator v.1.0'. Start successfull. 70 2008-05-30 11:35:41 -- Module: 'Pinger v.1.01'. Start successfull. 100 2008-05-30 11:35:41 -- Module: 'Stg configurator v.0.07'. Start successfull. 220 2008-05-30 11:35:42 -- Stg started successfully. Куда можно покопать? Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения