URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 623
[ Назад ]

Исходное сообщение
"Как читать из файла в фоновом режиме ?"

Отправлено Андрей , 25-Мрт-02 12:02 
Привет всем :)

gcc version 2.96 20000731 (Red Hat Linux 7.0). Без иксов.

Как можно (и можно ли:) организовать чтение из файла в фоновом режиме ?

То есть: обычный режим - это когда сказал fread (или там fscanf) и оно пока не прочитает, управления не отдаст.
Зато уж если отдала - значит точно прочитала (или ошибка:).

А вот чтобы сказал "считать столько-то туда-то", оно сразу вернуло управление и начало в фоне  читать.
А программа в это время пошла другие дела делать.
Дочитало, заполнило буфер - взвело флажок/квиток готовности.

Так бывает ? Может, библиотека такая есть ? :)

Заранее спасибо.


P.S. MPI-2 не предлагать :))


Содержание

Сообщения в этом обсуждении
"RE: Как читать из файла в фоновом режиме ?"
Отправлено Андрей , 25-Мрт-02 15:51 
Есть мнение, что это таки должны быть pthread.
Посему, не снимая первого вопроса, еще два:

1. Кто-нибудь использовал это (pthread) ? Оно по-прежнему not-recommended или уже сделали нормальную реализацию (ядро 2.2.х)?

2. Если использовать pthread, то это должно выглядеть примерно так:

вызывающая прога:
- сбросить флажок "фю"
- pthread_create (.., *функция нити, ...)
   ...
- если флажок "фю" установлен, то считано

функция нити:
- считали что нужно
- выставили флажок "фю"
- pthread_exit (...)


Или я чего-то главного недопонимаю ?


P.S. А может, __clone надо использовать ? :)


>Привет всем :)
>
>gcc version 2.96 20000731 (Red Hat
>Linux 7.0). Без иксов.
>
>Как можно (и можно ли:) организовать
>чтение из файла в фоновом
>режиме ?
>
>То есть: обычный режим - это
>когда сказал fread (или там
>fscanf) и оно пока не
>прочитает, управления не отдаст.
>Зато уж если отдала - значит
>точно прочитала (или ошибка:).
>
>А вот чтобы сказал "считать столько-то
>туда-то", оно сразу вернуло управление
>и начало в фоне  
>читать.
>А программа в это время пошла
>другие дела делать.
>Дочитало, заполнило буфер - взвело флажок/квиток
>готовности.
>
>Так бывает ? Может, библиотека такая
>есть ? :)
>
>Заранее спасибо.
>
>
>P.S. MPI-2 не предлагать :))



"RE: Как читать из файла в фоновом режиме ?"
Отправлено Soldier , 25-Мрт-02 18:51 
>Есть мнение, что это таки должны
>быть pthread.
>Посему, не снимая первого вопроса, еще
>два:
>
>1. Кто-нибудь использовал это (pthread) ?
>Оно по-прежнему not-recommended или уже
>сделали нормальную реализацию (ядро 2.2.х)?
>
>
>2. Если использовать pthread, то это
>должно выглядеть примерно так:
>
>вызывающая прога:
> - сбросить флажок "фю"
> - pthread_create (.., *функция нити,
>...)
>   ...
> - если флажок "фю" установлен,
>то считано
>
>функция нити:
> - считали что нужно
> - выставили флажок "фю"
> - pthread_exit (...)
>
>
>Или я чего-то главного недопонимаю ?
>
>
>
>P.S. А может, __clone надо использовать
>? :)
>
>

Sm.
http://centaurus.cs.umass.edu/~wagner/threads_html/tutorial....


"RE: Как читать из файла в фоновом режиме ?"
Отправлено Z0termaNN , 28-Мрт-02 13:14 
прям как в vms.
на самом деле есть целых 4 приема это сделать:
1. pthreads
2. signal driven IO
3. async io ( aio_* functions)
4. сделать несколько процессов и общаться через ipc.

"RE: Как читать из файла в фоновом режиме ?"
Отправлено Андрей , 28-Мрт-02 13:26 
Ага, спасибо всем. Ссылка про нитки полезная :))


>3. async io ( aio_* functions)

А по поводу п.3 маны какие-нибудь бывают ? :) Или хоть так, на пальцах ?

Андрей


"RE: Как читать из файла в фоновом режиме ?"
Отправлено Арлекин , 28-Мрт-02 13:52 
Попробуй так:
$ls -l /usr/share/man/man*/*aio*
Получишь целый выводок, если они установлены.

"RE: Как читать из файла в фоновом режиме ?"
Отправлено Андрей , 28-Мрт-02 14:07 
>Попробуй так:
>$ls -l /usr/share/man/man*/*aio*
>Получишь целый выводок, если они установлены.
>

apropos aio я сразу попробовал :) увы

ls: /usr/share/man/man*/*aio*: No such file or directory

А вот что нашлось:

/usr/include/aio.h
/usr/src/linux-2.2.16/drivers/scsi/aacraid/include/fsaioctl.h
/usr/i386-glibc21-linux/include/aio.h

Это значит, что оно не установлено ? Или просто манов нет нужных ?

Linux RedHat 7.0 Guinnes, kernel 2.2.16-22


"RE: Как читать из файла в фоновом режиме ?"
Отправлено Арлекин , 28-Мрт-02 14:14 
Маны могут быть и в /usr/local/share и еще чер-те где. Может $MANPATH на них не указывает. Ищи
find / -name *aio* -print
так по-моему. Если где найдутся сделаешь
export MANPATH=$MANPATH:<где нашел>
и всё будет видно.

"RE: Как читать из файла в фоновом режиме ?"
Отправлено Андрей , 28-Мрт-02 15:32 
>Маны могут быть и в /usr/local/share
>и еще чер-те где. Может
>$MANPATH на них не указывает.
>Ищи
>find / -name *aio* -print

Это я тоже делал. Именно так и нашлись те три файла, которые я написал.

Ладно, маны-то я нашел в интернете:
http://ace.florin.ru/doc/susv2/xshix.html
Вопрос в другом - как эту библиотеку поставить ?
Скачал  libaio-0.3.8.tar.gz, собрал, поставил. Появились в ./usr/lib файлы libaio.so, libaio.a...
Линкер стал понимать ключ -laio, но:

seqw1.o(.text+0x48): undefined reference to `aio_read'
collect2: ld returned 1 exit status


Похоже, что это (libaio) просто интерфейс к настоящему aio... как же его, настоящего, поставить ?

Кто что может посоветовать ? :)


"RE: Как читать из файла в фоновом режиме ?"
Отправлено XMan , 28-Мрт-02 15:49 
А что-то типа:

gcc -laio ...

не помогает ?


"RE: Как читать из файла в фоновом режиме ?"
Отправлено Андрей , 28-Мрт-02 15:53 
>А что-то типа:
>
>gcc -laio ...
>
>не помогает ?

файлов libaio.* в системе нет. Соответственно -laio говорит "не могу найти".

Описание попытки поставить либы - в моем предыдущем постинге.



"RE: Как читать из файла в фоновом режиме ?"
Отправлено Арлекин , 28-Мрт-02 15:52 
Короче.
На соляре этот пример
#include <aio.h>
main()
{
   struct aiocb s;
   int k = aio_read(&s);
}
странслировался и собрался такой командой
$CC aiotest.cc -o aiotest -lposix4
БЕЗ ВОПРОСОВ. Все у тебя есть. Делай маленькие примерчики - как разберешься все пойдет. А какой командой собирать написано в первых строчках мана.
Успехов.

"RE: Я ща видел те маны."
Отправлено Арлекин , 28-Мрт-02 16:01 
Если в линухе ВСЕ маны ТАК пишут, я вам ребята не завидую. Соляркин ман такой:
Realtime Library                                     aio_read(3R)

NAME
     aio_read, aio_write - asynchronous read and write operations

SYNOPSIS
     cc [ flag ... ] file ...  -lposix4 [ library ... ]

     #include <aio.h>

     int aio_read(struct aiocb *aiocbp);

     int aio_write(struct aiocb *aiocbp);

     struct aiocb {
          int                aio_fildes;       /* file descriptor */
          volatile void      *aio_buf;         /* buffer location */
          size_t             aio_nbytes;       /* length of transfer */
          off_t              aio_offset;       /* file offset */
          int                aio_reqprio;      /* request priority offset */
          struct sigevent    aio_sigevent;     /* signal number and offset */
          int                aio_lio_opcode;   /* listio operation */
     };

     struct sigevent {
          int                sigev_notify;     /* notification mode */
          int                sigev_signo;      /* signal number */
          union sigval       sigev_value;      /* signal value */
     };

     union sigval {
          int                sival_int;        /* integer value */
          void               *sival_ptr;       /* pointer value */
     };

DESCRIPTION

ну и так далее. Попробуй с поЗиксовым ключом.


"RE: Я ща видел те маны."
Отправлено Андрей , 28-Мрт-02 16:51 
>
>ну и так далее. Попробуй с
>поЗиксовым ключом.

неа :)

Посмотрел в FreeBSD4.4. Маны есть, слово aio_read обнаружилось в /usr/lib/libc.a

Я прогрепал весь /usr/lib - и нашел таки. /usr/lib/librt.a Соответственно ключ -lrt - и все собралось.

Спасибо за помощь.


"RE: Я ща видел те маны."
Отправлено Андрей , 28-Мрт-02 16:53 
>>
>>ну и так далее. Попробуй с
>>поЗиксовым ключом.
>
>неа :)
>
>Посмотрел в FreeBSD4.4. Маны есть, слово
>aio_read обнаружилось в /usr/lib/libc.a

То есть вот это, ниже - это про мой линукс, не про фрю :)

/usr/lib/librt.a Соответственно ключ -lrt