![]() |
|
Модераторы: xvr |
![]()
|
|
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
Здравстуйте, обитатели форума.
прошу помощи в реализации такой практически возникшей передо мной задачи: Дано: - сервер FreeBSD - внешний скрипт через веб-интерфейс формирует данные - длинный список из неизвестного заранее количества float порядка сотен и одно какое особое заданное число Нужно: - вернуть номера позиций из них, которые ближе всего приближаются к заданному числу путем складывания, вычитания, умножения или деления любых из списка - делать это по возможности быстро Предполагаю написать демон под FreeBSD, который будет отслеживать появление файлов с данными, загружать этот список чисел, запускать цикл тройной вложенности, запоминать комбинацию с минимальной погрешностью и сохранять эту комбинацию в файл Вопросы такие, которые сам не могу придумать из-за того, что это моя первая задача на C: - как лучше организовать эту очередь задач на расчет? предполагается, что веб-интерфейс будет формировать какую-то очередь fifo на расчет, а потом забирать результаты - как сделать демон? пока собираюсь дописать функцию в код /usr/src/usr.sbin/daemon/daemon.c
стоит ли делать какие-нибудь разные потоки для вычисления каждого нового задания или считать одним по очереди? если сильно стоит, то я не поленюсь, научусь :) сервер не жалко, лишь бы не падала система под нагрузкой вот не пойму, как вообще организовать этот поток получения данных и отдачу? нужно как-то идентифицировать один от другого - в отдельном файле? именем файла? как там будет с блокировками? а то начнет читать, пока веб-морда в него пишет... надо какой-то файл-флаг готовности или писать из веба данные во временный файл, а потом уже готовый переименовывать? каким путем идти? думаю, надо будет юзать malloc для выделения нужного объема памяти после чтения очередной порции данных? |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
как вариант, использовать какой-нибудь IPC думаю, тут лучше всего подойдут именованные каналы т. е создаем два именованных канала, в один из них веб-интерфейс пишет запрос, который обрабатывает демон, через второй он (веб-интерфейс) получает результат запрос можно оформить в виде пакета: заголовок (количество чисел) и тело (сами числа) аналогично с ответом
если критична скорость получения результата, возможно стоит обрабатывать каждый запрос в отдельном потоке но тут тоже не все однозначно, надо больше информации, чтобы ответить на этот вопрос -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
я тут надумал, что может логичнее брать данные напрямую из базы mysql, откуда их берет и готовит веб-морда
фактически, достаточно передавать только одну цифру ID набора данных для расчета, остальное можно получить прямо в коде С то есть общий алгоритм, если не делать несколько потоков, примерно такая может быть: при старте демона говорим ему параметры мускуля - сокет, базу, логин/пароль, таблицу 1. демоном читаем, если есть, файл dataset.id 2. берем из dataset.id целое id набора данных из таблицы 3. считаем и пишем в базу 4. повторить с цифры 1 так, наверное, будет проще и надежнее, чем с файлами париться? на один файл проще права дать один раз, а паузой будет id равное 0, например правда, я с мускулом пока не знаю насколько просто/сложно работать с мускулем из C что-то не пойму, это полностью самодостаточный код демона или функция отдельная? Это сообщение отредактировал(а) Larrikin - 15.8.2007, 19:30 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Считай, что это код функции main(). |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
зачем файл? нужна будет синхронизация тут лучше именованный канал, как я уже говорил -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
man 3 mkfifo, man 2 pipe и man 2 socket Это сообщение отредактировал(а) bsa - 15.8.2007, 20:24 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Larrikin,
ты С вообще знаешь хорошо? если собрался писать под какую-то ОС (в твоем случае BSD), то одним С не обойдешься нужно знание API конкретно по вопросу вот, имхо, лучшая книга + маны, маны и еще раз маны man 3 mkfifo -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
когда-то пару прог на лабораторных написал в институте вот заказал в Озоне, вроде такая же http://www.ozon.ru/context/detail/id/2355792/ пару дней с вопросами не буду приставать - пофтыкаю маны, подожду книжку... |
|||
|
||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
фтыкаю книжку Марка Дж. Рочкинда - похоже, лучше через сокеты делать?
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Unix domain sockets? или обычные? Это сообщение отредактировал(а) MAKCim - 20.8.2007, 21:07 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
для начала попробую на unix, потом вроде несложно переделывать на сетевые
только у меня что-то не компилируется пример из книжки http://www.basepath.com/aup/ex/sktex_8c.html: > gcc -DFREEBSD sktex.c /var/tmp//ccyQH9U8.o(.text+0x59): In function `main': : undefined reference to `ec_in_cleanup' вроде все аккуратно добавил, что он хотел: > ll total 24 -rw-r--r-- 1 larrikin wheel 3278 Aug 20 20:14 defs.h -rw-r--r-- 1 larrikin wheel 2228 Aug 20 20:14 ec.h -rw-r--r-- 1 larrikin wheel 964 Aug 20 20:14 extio.h -rw-r--r-- 1 larrikin wheel 210 Aug 20 20:14 logf.h -rw-r--r-- 1 larrikin wheel 130 Aug 20 20:13 macrostr.h -rw-r--r-- 1 larrikin wheel 255 Aug 20 20:13 options.h -rw-r--r-- 1 larrikin wheel 2220 Aug 20 20:13 sktex.c -rw-r--r-- 1 larrikin wheel 2077 Aug 20 20:13 suvreq.h > в книжке по С написано, что ищет в /usr/include - скопировал туда тоже, что вообще странно для BSD, скорее должно где-нить быть в /usr/local/include - тоже самое дает щас пытаюсь надеюсь найти возможность при компиляции задавать путь для поиска заголовочных файлов... Это сообщение отредактировал(а) Larrikin - 20.8.2007, 21:34 |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| Larrikin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 15.8.2007 Репутация: нет Всего: нет |
хм... дело, видимо, не в бобине...
gcc -DFREEBSD -I /usr/home/larrikin/files/examples.c/ sktex.c | less /var/tmp//ccUZoeWV.o(.text+0x59): In function `main': : undefined reference to `ec_in_cleanup' /var/tmp//ccUZoeWV.o(.text+0xb7): In function `main': : undefined reference to `ec_push' /var/tmp//ccUZoeWV.o(.text+0xf7): In function `main': : undefined reference to `ec_in_cleanup' /var/tmp//ccUZoeWV.o(.text+0x13b): In function `main': : undefined reference to `ec_push' /var/tmp//ccUZoeWV.o(.text+0x149): In function `main': : undefined reference to `ec_in_cleanup' /var/tmp//ccUZoeWV.o(.text+0x1a7): In function `main': : undefined reference to `ec_push' придется еще пару дней вкуривать в азы компиляции, блин столько времени убивается на эти все отвлекающие от сути задачи нюансы языка и реализаций... |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Larrikin,
смотри если есть исходник
он расположен, допустим, в sources в директории, где находится директория sources, находится директория, допустим, inc, которая содержит include/lib.h, headers/groups.h и assembler.h тогда, находясь в ./sources, компилировать исходник нужно так
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |