Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: hda0
Дата сообщения: 14.01.2010 10:46
ValidolX

Цитата:
Покажите как описана mysql_error()

искал, не нашёл.. где она может быть? грепом пробежался по сырцам - нето имхо.

Код: grep "mysql_error" * -R
script/test.c: mysql_error(&mysql));
sql_module.c: log(L_ERR,"MYSQL Error: %s",mysql_error(socket->sock));
sql_module.c: log(L_ERR,"MYSQL error: %s",mysql_error(socket->sock));
sql_module.c: return mysql_error(socket->sock);
sql_module.c: DEBUG2("sql_check_socket: ping socket %d type %d OK : %s", socket->id,socket->type,mysql_error(socket->sock));
sql_module.c: log(L_CONS|L_ERR, "sql_check_socket: ping socket %d type %d hard error %d : %s",socket->id,socket->type,error,mysql_error(socket->sock));
sql_module.c: log(L_CONS|L_ERR, "sql_check_socket: ping socket %d type %d soft error %d : %s", socket->id,socket->type,error,mysql_error(socket->sock));
sql_module.c: log(L_CONS|L_ERR, "sql_check_socket: ping socket %d type %d soft error %d : %s", socket->id,socket->type,error,mysql_error(socket->sock));
Автор: karakurt2
Дата сообщения: 14.01.2010 11:31
hda0
мроблема в том, что неявно преобразуется тип const char* в тип char*. это запрещено, применяйте приведение типа.
Автор: hda0
Дата сообщения: 14.01.2010 11:35
karakurt2
еслибы я знал как
поэтому и прошу помощи - что поменять на что исправить и тд?
Автор: karakurt2
Дата сообщения: 14.01.2010 11:57

Цитата:
char *sql_error(SQLSOCK *socket) {
return (char*) mysql_error(socket->sock);
}


примерно так

предупреждения помогают программисту избежать ошибок на этапе сборки проекта, вместо того, чтобы потом часами выискивать их в отладчике.
Автор: hda0
Дата сообщения: 14.01.2010 12:14
karakurt2
спасибо огромное! сработало, прога скомпилилась без ошибок и ворнингов.
Автор: deman_ru
Дата сообщения: 14.01.2010 12:32
derelict
snike555 спасибо Вам ребят большое!
Зачем я хотел формировать БД в первый рас, я хотел реализовать клиент-серверную технологию доступа к БД, чтобы база лежала где то на сервере, а пользователь при помощи приложения клиент подключался к ней и добавлял правила, просто это хороший вариант для обмена симптомами и диагнозами между врачами так сказать (обмен опытом), и быстрое наполнение базы данных. И вот почему нужно выгрузить данные из базы данных, сформировать правила и записать их а базу знаний, иначе механизм вывода нужно реализовывать при помощи sql.
Или может правда так сделать? если это конечно правильно.
И еще хотел бы у вас попросить совета, какой механизм вывода использовать, для представления базы знаний в виде семантической сети, ну как выше? И может подскажите где можно ознакомится подробней с этим алгоритмом, примеры там и тому подобное. Просто в книжка описано, но описано все поверхностно, хотелось бы больше конкретики.
Автор: karakurt2
Дата сообщения: 14.01.2010 13:00
deman_ru
создаёте в базе данных две таблицы-справочника, где описываются отдельно болезни и их симптомы. создаёте ещё одну таблицу, в которой описывается соответсвие индексов между второй и первой таблицами. пишите пользовательский интерфейс для работы с базой данных. база данных и есть ваша база знаний, ничего не нужно выгружать. всё можно сделать на уровне SQL-запросов. экспертная система будет, если позволить авторитетным пользователям добавлять записи в вашу базу знаний.

на самом деле, тут больше требуются знания по работе с базами данных, чем по языку программирования.
Автор: deman_ru
Дата сообщения: 14.01.2010 15:20
karakurt2
Спасибо Вам большое! А Вы знаете примеры экспертных систем реализованных по такому принципу, может поделитесь ссылочкой? Или какие нибудь книжки и статьи с описанием реализации таких экспертных систем.
Автор: karakurt2
Дата сообщения: 14.01.2010 17:31
deman_ru
Общие идеи построения экспертных систем Вам описал snike555 в своём первом сообщении. Это первое, что приходит на ум по поводу вашей задачи. В принципе, когда я был студентом, на спецкурсе мы реализовывали второй вариант, где строится дерево. А создание базы данных -- это лишь удобный инструмент, которым я бы воспользовался сейчас. Я не специализируюсь в этой области, просто высказываю свои мысли. Чтобы получить полное представление по экспертным системам надо читать специализированную литературу.
Автор: GeMir
Дата сообщения: 15.01.2010 21:21
В C (не C++) ведь, наверняка, есть что-то вроде test -d FILE ("файл существует
и является папкой") и test -L FILE ("файл существует и является символьным линком")
из Unix? Не stat() ли его случайно зовут?
Автор: Abs62
Дата сообщения: 15.01.2010 22:18
GeMir
stat, но в Стандарте C его нет, ЕМНИМС.
Автор: Irjinn
Дата сообщения: 16.01.2010 22:46
Добрый день!
Помогите пожалуйста!

работаю с Visual Studio 2008, нужно вывести пиксель на форму

как это сделать, не имею понятия, долго ковырялся с
Код:
im =this->CreateGraphics();
Автор: hda0
Дата сообщения: 19.01.2010 15:21
Возвращаясь к посту http://forum.ru-board.com/topic.cgi?forum=33&topic=3174&start=2940#1
и так, прога "ic-radius" скомпилена, работает. но капризы продолжаются. при нагрузке >35 пользователей одновременно на авторизацию - происходит где то "затор", и пользователи не могут авторизоваться (может быть около 200-250 одновременных запросов на авторизацию). если я выключаю всех юзеров, то в логах радиуса я еще минут 10-15 наблюдаю как он разгребает очередь на авторизацию хотя пользователей давно уж и нет.

Прошу помощи в поиске этого бага в сырцах программы.

Может кто заметит узкое место в программном коде, которое очередь жутко затормаживает в программе?

сырцы адаптированные под fc8,11 и 12 можно забрать у меня тут
Автор: ValidolX
Дата сообщения: 19.01.2010 20:38
hda0
Затор интересный )))

а именно - захаркожена константа - макс. кол-во сокет-дескрипторов - 32 (считая с 3-его включительно (0,1,2 - ето in/out/err стандрартные дескрипторы)

так вот, идите в модуль Radiusd-acct.c, функа main()
ищите там меджик число 32 - вместо нее советую завести а) константу б) макрос - что удобней - ето и будет верхний лимит юзеров

еще надо поинтересоваться сколько в вашем Линуксе можно сокетов иметь открытых в процессе

Удачи
Автор: hda0
Дата сообщения: 19.01.2010 21:22
ValidolX
спасибо за первый отзыв

Цитата:
идите в модуль Radiusd-acct.c

вернее Radiusd-auth.c


Цитата:
ищите там меджик число 32

нашёл, только что делать с ним - не знаю.


Цитата:
а) константу б) макрос

подробнее можно? я ж не понимаю в сях как завести константу или макрос?
Автор: ValidolX
Дата сообщения: 19.01.2010 21:29
hda0

где-нибудь сверху в файле (не в функции!)
#define MAX_SD 128

дальше меняем найденное 32 на MAX_SD (там вроде в 2ох функциях)

компилирен, раннинг, хевинг фан )))
Автор: hda0
Дата сообщения: 19.01.2010 21:52
ValidolX
поменял.
надеюсь поможет. можно узнать, почему Вы уверены что в этом именно проблема возникает?

а так буду ждать следующий пик нагрузки что бы увидеть результат.
Автор: ValidolX
Дата сообщения: 19.01.2010 22:20

Цитата:
можно узнать, почему Вы уверены что в этом именно проблема возникает?

Приходилось стыкаться вплотную с сокетами под ембеддед системами

Больше вроде как бы негде там затыкаться

Автор: hda0
Дата сообщения: 20.01.2010 10:13
ValidolX
почитал про файловые дескрипторы.
в старых ЮНИКСах было значение 19, далее расширили до нескольких тысяч.


Цитата:
Файловые дескрипторы могут принимать значения от 0 до OPEN_MAX. Старые версии UNIX имели верхний предел до 19, позволяя одному процессу открывать до 20 файлов. Сейчас это значение увеличено до нескольких тысяч.

но я не нашел в доке зависимости между дескрипторами и забиванием очереди.
очередь в радиусе ведь не работает с файлами в ФС?!


Цитата:
Все открытые файлы ссылаются к ядру через так называемые файловые дескрипторы. Файловый дескриптор — это неотрицательное целое число. Когда мы открываем существующий файл или создаем новый файл, ядро возвращает процессу файловый дескриптор.


или я чё то не так понял?

p.s. вспомнил, что использую в программе аттрибут (Exec-Program) вызова дополнительной проверки внешней программой. т.е. из радиуса идёт вызов внешней программы, написанную тоже на С. Внешняя прога на С отрабатывает и выдаёт результат реактивно.
может ли вызов внешней программы сказаться на затормаживании очереди?
Автор: ValidolX
Дата сообщения: 20.01.2010 10:33

Цитата:
но я не нашел в доке зависимости между дескрипторами и забиванием очереди.
очередь в радиусе ведь не работает с файлами в ФС?!


в любом Юниксе работает концепия - every device is a file (будь то проц, память, файл, сокет и т.д)

атрибут файла- файл-дескриптор (или сокет дескриптор и т.д)


Цитата:
может ли вызов внешней программы сказаться на затормаживании очереди?

Еще как может

У вас ведь радиус-сервер - одно или мульти-поточен?
в идеале один клиент -один поток, а сервер только слушает и принимает клиентов, но тут тоже не все просто - если клиентов - много - надо делать пул потоков, а то никаких ресурсов не хватит
например - пул из 32 потоков - если меньше - каждому по потоку, если больше - ждем на свободную запись в пуле и т.д.
Автор: hda0
Дата сообщения: 20.01.2010 12:03
ValidolX

Цитата:
У вас ведь радиус-сервер - одно или мульти-поточен?

честно, не знаю.


Цитата:
например - пул из 32 потоков - если меньше - каждому по потоку, если больше - ждем на свободную запись в пуле и т.д.

т.е. чисто теоретически:
замена

Код:
/*
* Close unused file descriptors.
*/
for (t = 32; t >= 3; t--)
close(t);
Автор: ValidolX
Дата сообщения: 20.01.2010 14:30

Цитата:
честно, не знаю.

Вопрос поставлен, теперь надо узнать, хотя если цели написать мультипотокового демона нету (и нету знаний язика) - оставляем как есть


Цитата:
способна избавится от текущей проблемы?

етот код с close() - вообще как бы профилкатический

а вот етот кусок кода

Цитата:
status = select(32, &readfds, NULL, NULL, NULL);


как раз то что надо в первую очередь сменить!
ето как уже говорил - сердце демона (сервера)

меняем 32 на define и смотрим (еще лучше сделать тест-експеримент - или написать самому радиус клиента или заюзать готовую прогу - кинуть 100..200..500 клиентов на радиус демон - зачем ждать когда свалиться само ))
Автор: DeDaZar
Дата сообщения: 20.01.2010 15:47
Доброго времени суток. Помогите пожалуста. Пытаюсь собрать cairo под win32, застопорился на сборке необходимой библиотеки pixman.

Запускаю сборку через make с параметрами:
make -f Makefile.win32 "CFG=release" "MMX=on" "SSE2=on"

Он проглатывает и рапартует мне:
*** No rule to make target 'release/pixman-image.obj', needed by 'release/pixman-1.lib'. Stop

Платформа win32(vista)
библиотека pixman 0.16.2

Каких ему может нехватать правил?
Пытался гуглить по этому вопросу, ни чего стоящего не нашел.
Буду рад любой помощи.
Автор: ValidolX
Дата сообщения: 20.01.2010 16:02

Цитата:
Доброго времени суток. Помогите пожалуста. Пытаюсь собрать cairo под win32, застопорился на сборке необходимой библиотеки pixman.


линки на сорс в студию
или ето для телепатов? )))
Автор: DeDaZar
Дата сообщения: 20.01.2010 16:09
Не, я думал может кто сталкивался...
вот ссылки
http://cairographics.org/end_to_end_build_for_win32/
http://www.cairographics.org/releases/pixman-0.16.2.tar.gz
Автор: hda0
Дата сообщения: 20.01.2010 20:05
ValidolX
сменил 32 везде, где нашел грепом. получилось еще в трёх файлах:
[root@bill ic019-1]# grep MAX_SD *
exec.c: for(n = MAX_SD; n >= 3; n--)
mysql.c: for (n = MAX_SD; n >= 3; n--)
radiusd-acct.c: for (t = MAX_SD; t >= 3; t--)
radiusd-acct.c: status = select(MAX_SD, &readfds, NULL, NULL, NULL);
radiusd-auth.c: for (t = MAX_SD; t >= 3; t--)
radiusd-auth.c: status = select(MAX_SD, &readfds, NULL, NULL, NULL);
radiusd.c: for (t = MAX_SD; t >= 3; t--)
radiusd.c: status = select(MAX_SD, &readfds, NULL, NULL, NULL);
radiusd.h:#define MAX_SD 512
на счёт exec.c: и mysql.c: не уверен надо ли было там менять(?), но условие похоже на те что в основных файлах
Автор: ValidolX
Дата сообщения: 20.01.2010 20:29
hda0
Нормально
только надо добавить include на тот файл где определен макрос MAX_SD

что показало тестирование?
Автор: hda0
Дата сообщения: 20.01.2010 21:22
ValidolX

Цитата:
надо добавить include на тот файл

не надо, он инклудом стоял уже
иначе бы не собралось


Цитата:
что показало тестирование?

сегодня нагрузку пока выдержало, и то без изменения в строке
status = select(32, &readfds, NULL, NULL, NULL); .
позже я уже сделал фикс и в этой строке.
на днях попробую спровоцировать массовый обвал - чтобы примерно 120 человек разом ломанулись, и тогда будет видно.
Автор: hda0
Дата сообщения: 21.01.2010 10:31
ValidolX
собрал прогу под фс9 и фс12 полёт нормульный
еще походу собрал под фрибсд 6.4, и за ночь в консольке вылезло:

Код: radiusd-auth in malloc(): error: recursive call
radiusd-auth in malloc(): error: recursive call
radiusd-auth in malloc(): error: recursive call
....много строк....
radiusd-auth in malloc(): error: recursive call
Автор: ValidolX
Дата сообщения: 21.01.2010 10:51
hda0
Проблема неочевидна

суть (из мана) -

recursive call A process has attempted to call an allocation function
recursively. This is not permitted. In particular, signal handlers
should not attempt to allocate memory.

Очень вероятно что ето проблема в коде (при неких граничных условиях)
Идея - возможно в коде есть выделение памяти (malloc()) в обработчике сигнала - проверьте так ли ето (сейчас нету исходников под руками).
В обработчика сигнала, ето не разрешено по моему
Видимо Федора и Фря по разному обрабатывают такое

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.