Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> демон под BSD для вычислений 
V
    Опции темы
Larrikin
Дата 15.8.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Здравстуйте, обитатели форума.

прошу помощи в реализации такой практически возникшей передо мной задачи:

Дано:
 - сервер FreeBSD
 - внешний скрипт через веб-интерфейс формирует данные  - длинный список из неизвестного заранее количества float порядка сотен и одно какое особое заданное число

Нужно:
 - вернуть номера позиций из них, которые ближе всего приближаются к заданному числу путем складывания, вычитания, умножения или деления любых из списка
 - делать это по возможности быстро

Предполагаю написать демон под FreeBSD, который будет отслеживать появление файлов с данными, загружать этот список чисел, запускать цикл тройной вложенности, запоминать комбинацию с минимальной погрешностью и сохранять эту комбинацию в файл

Вопросы такие, которые сам не могу придумать из-за того, что это моя первая задача на C:
- как лучше организовать эту очередь задач на расчет? предполагается, что веб-интерфейс будет формировать какую-то очередь fifo на расчет, а потом забирать результаты
- как сделать демон? пока собираюсь дописать функцию в код /usr/src/usr.sbin/daemon/daemon.c 
Код

#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/usr.sbin/daemon/daemon.c,v 1.3.8.1 2006/01/15 17:50:36 delphij Exp $");

#include <sys/param.h>

#include <err.h>
#include <errno.h>
#include <libutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void usage(void);
int
main(int argc, char *argv[])
{
        struct pidfh *pfh;
        int ch, nochdir, noclose, errcode;
        const char *pidfile;
        pid_t otherpid;

        nochdir = noclose = 1;
        pidfile = NULL;
        while ((ch = getopt(argc, argv, "-cfp:")) != -1) {
                switch (ch) {
                case 'c':
                        nochdir = 0;
                        break;
                case 'f':
                        noclose = 0;
                        break;
                case 'p':
                        pidfile = optarg;
                        break;
                default:
                        usage();
                }
        }
        argc -= optind;
        argv += optind;

        if (argc == 0)
                usage();
        /*
         * Try to open the pidfile before calling daemon(3),
         * to be able to report the error intelligently
         */
        if (pidfile) {
                pfh = pidfile_open(pidfile, 0600, &otherpid);
                if (pfh == NULL) {
                        if (errno == EEXIST) {
                                errx(3, "process already running, pid: %d",
                                    otherpid);
                        }
                        err(2, "pidfile ``%s''", pidfile);
                }
        }

        if (daemon(nochdir, noclose) == -1)
                err(1, NULL);

        /* Now that we are the child, write out the pid */
        if (pidfile)
                pidfile_write(pfh);

        execvp(argv[0], argv);

        /*
         * execvp() failed -- unlink pidfile if any, and
         * report the error
         */
        errcode = errno; /* Preserve errcode -- unlink may reset it */
        if (pidfile)
                pidfile_remove(pfh);

        /* The child is now running, so the exit status doesn't matter. */
        errc(1, errcode, "%s", argv[0]);
}

static void
usage(void)
{
        (void)fprintf(stderr,
            "usage: daemon [-cf] [-p pidfile] command arguments ...\n");
        exit(1);
}



стоит ли делать какие-нибудь разные потоки для вычисления каждого нового задания или считать одним по очереди? если сильно стоит, то я не поленюсь, научусь :)
сервер не жалко, лишь бы не падала система под нагрузкой

вот не пойму, как вообще организовать этот поток получения данных и отдачу?
нужно как-то идентифицировать один от другого - в отдельном файле? именем файла?
как там будет с блокировками? а то начнет читать, пока веб-морда в него пишет...
надо какой-то файл-флаг готовности или писать из веба данные во временный файл, а потом уже готовый переименовывать? каким путем идти?
думаю, надо будет юзать malloc для выделения нужного объема памяти после чтения очередной порции данных?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 15.8.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  15.8.2007,  17:59 Найти цитируемый пост)
- как сделать демон? пока собираюсь дописать функцию в код /usr/src/usr.sbin/daemon/daemon.c 

Код

int make_self_daemon() {
    pid_t pid = fork();
    if (pid > 0) 
        _exit(0);
    else if (pid < 0)
        return -1;
    setsid();
    close(STDOUT_FILENO);
    close(STDIN_FILENO);
    close(STDERR_FILENO);
    run(); /* основная функциональность демона */
}

Цитата(Larrikin @  15.8.2007,  17:59 Найти цитируемый пост)
- как лучше организовать эту очередь задач на расчет? предполагается, что веб-интерфейс будет формировать какую-то очередь fifo на расчет, а потом забирать результаты

как вариант, использовать какой-нибудь IPC
думаю, тут лучше всего подойдут именованные каналы
т. е создаем два именованных канала, в один из них веб-интерфейс пишет запрос, который обрабатывает демон, через второй он (веб-интерфейс) получает результат
запрос можно оформить в виде пакета: заголовок (количество чисел) и тело (сами числа)
аналогично с ответом
Цитата(Larrikin @  15.8.2007,  17:59 Найти цитируемый пост)
стоит ли делать какие-нибудь разные потоки для вычисления каждого нового задания или считать одним по очереди?

если критична скорость получения результата, возможно стоит обрабатывать каждый запрос в отдельном потоке
но тут тоже не все однозначно, надо больше информации, чтобы ответить на этот вопрос


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 15.8.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



я тут надумал, что может логичнее брать данные напрямую из базы mysql, откуда их берет и готовит веб-морда
фактически, достаточно передавать только одну цифру ID набора данных для расчета, остальное можно получить прямо в коде С

то есть общий алгоритм, если не делать несколько потоков, примерно такая может быть:

при старте демона говорим ему параметры мускуля - сокет, базу, логин/пароль, таблицу
1. демоном читаем, если есть, файл dataset.id
2. берем из dataset.id целое id набора данных из таблицы
3. считаем и пишем в базу
4. повторить с цифры 1

так, наверное, будет проще и надежнее, чем с файлами париться?
на один файл проще права дать один раз, а паузой будет id равное 0, например

правда, я с мускулом пока не знаю насколько просто/сложно работать с мускулем из C smile

Цитата(MAKCim @  15.8.2007,  18:16 Найти цитируемый пост)
код C++
int make_self_daemon() {

что-то не пойму, это полностью самодостаточный код демона или функция отдельная?


Это сообщение отредактировал(а) Larrikin - 15.8.2007, 19:30
PM MAIL WWW ICQ   Вверх
bsa
Дата 15.8.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(Larrikin @ 15.8.2007,  19:11)
Цитата(MAKCim @  15.8.2007,  18:16 Найти цитируемый пост)
код C++
int make_self_daemon() {

что-то не пойму, это полностью самодостаточный код демона или функция отдельная?

Считай, что это код функции main().
PM   Вверх
MAKCim
Дата 15.8.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  15.8.2007,  19:11 Найти цитируемый пост)
1. демоном читаем, если есть, файл dataset.id
2. берем из dataset.id целое id набора данных из таблицы

зачем файл?
нужна будет синхронизация
тут лучше именованный канал, как я уже говорил


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 15.8.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @  15.8.2007,  19:59 Найти цитируемый пост)
 лучше именованный канал

а где про это почитать? говорю же, я первый раз на С задачу решаю, есть только две бумажные книжки:
 - Программирование на языке С.Стефан Кочан
 - С++ Справочник.O'REILLY
PM MAIL WWW ICQ   Вверх
bsa
Дата 15.8.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(Larrikin @ 15.8.2007,  20:06)
Цитата(MAKCim @  15.8.2007,  19:59 Найти цитируемый пост)
 лучше именованный канал

а где про это почитать?

man 3 mkfifo, man 2 pipe и man 2 socket

Это сообщение отредактировал(а) bsa - 15.8.2007, 20:24
PM   Вверх
MAKCim
Дата 15.8.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Larrikin, 
ты С вообще знаешь хорошо?
если собрался писать под какую-то ОС (в твоем случае BSD), то одним С не обойдешься
нужно знание API
конкретно по вопросу
вот, имхо, лучшая книга
+ маны, маны и еще раз маны
man 3 mkfifo


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 15.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @  15.8.2007,  20:16 Найти цитируемый пост)
ты С вообще знаешь хорошо?

когда-то пару прог на лабораторных написал в институте smile лет десять назад...

вот заказал в Озоне, вроде такая же http://www.ozon.ru/context/detail/id/2355792/

пару дней с вопросами не буду приставать -  пофтыкаю маны, подожду книжку...
PM MAIL WWW ICQ   Вверх
Larrikin
Дата 20.8.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



фтыкаю книжку Марка Дж. Рочкинда - похоже, лучше через сокеты делать?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 20.8.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  20.8.2007,  20:29 Найти цитируемый пост)
фтыкаю книжку Марка Дж. Рочкинда - похоже, лучше через сокеты делать? 

Unix domain sockets?
или обычные?

Это сообщение отредактировал(а) MAKCim - 20.8.2007, 21:07


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 20.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 20.8.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  20.8.2007,  21:30 Найти цитируемый пост)
щас пытаюсь надеюсь найти возможность при компиляции задавать путь для поиска заголовочных файлов...

Код

# gcc -I <где ищем>



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 20.8.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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'


придется еще пару дней вкуривать в азы компиляции, блин столько времени убивается на эти все отвлекающие от сути задачи нюансы языка и реализаций...
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 20.8.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Larrikin, 
смотри
если есть исходник
Код

#include <include/lib.h>
#include <headers/groups.h>
#include <assembler.h>
...

он расположен, допустим, в sources
в директории, где находится директория sources, находится директория, допустим, inc, которая содержит
include/lib.h, headers/groups.h и assembler.h
тогда, находясь в ./sources, компилировать исходник нужно так
Код

# gcc -I ../inc -c <исходник>



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1258 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.