Привет всем :)gcc version 2.96 20000731 (Red Hat Linux 7.0). Без иксов.
Как можно (и можно ли:) организовать чтение из файла в фоновом режиме ?
То есть: обычный режим - это когда сказал fread (или там fscanf) и оно пока не прочитает, управления не отдаст.
Зато уж если отдала - значит точно прочитала (или ошибка:).А вот чтобы сказал "считать столько-то туда-то", оно сразу вернуло управление и начало в фоне читать.
А программа в это время пошла другие дела делать.
Дочитало, заполнило буфер - взвело флажок/квиток готовности.Так бывает ? Может, библиотека такая есть ? :)
Заранее спасибо.
P.S. MPI-2 не предлагать :))
Есть мнение, что это таки должны быть 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 не предлагать :))
>Есть мнение, что это таки должны
>быть 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....
прям как в vms.
на самом деле есть целых 4 приема это сделать:
1. pthreads
2. signal driven IO
3. async io ( aio_* functions)
4. сделать несколько процессов и общаться через ipc.
Ага, спасибо всем. Ссылка про нитки полезная :))
>3. async io ( aio_* functions)А по поводу п.3 маны какие-нибудь бывают ? :) Или хоть так, на пальцах ?
Андрей
Попробуй так:
$ls -l /usr/share/man/man*/*aio*
Получишь целый выводок, если они установлены.
>Попробуй так:
>$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
Маны могут быть и в /usr/local/share и еще чер-те где. Может $MANPATH на них не указывает. Ищи
find / -name *aio* -print
так по-моему. Если где найдутся сделаешь
export MANPATH=$MANPATH:<где нашел>
и всё будет видно.
>Маны могут быть и в /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... как же его, настоящего, поставить ?Кто что может посоветовать ? :)
А что-то типа:gcc -laio ...
не помогает ?
>А что-то типа:
>
>gcc -laio ...
>
>не помогает ?файлов libaio.* в системе нет. Соответственно -laio говорит "не могу найти".
Описание попытки поставить либы - в моем предыдущем постинге.
Короче.
На соляре этот пример
#include <aio.h>
main()
{
struct aiocb s;
int k = aio_read(&s);
}
странслировался и собрался такой командой
$CC aiotest.cc -o aiotest -lposix4
БЕЗ ВОПРОСОВ. Все у тебя есть. Делай маленькие примерчики - как разберешься все пойдет. А какой командой собирать написано в первых строчках мана.
Успехов.
Если в линухе ВСЕ маны ТАК пишут, я вам ребята не завидую. Соляркин ман такой:
Realtime Library aio_read(3R)NAME
aio_read, aio_write - asynchronous read and write operationsSYNOPSIS
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
ну и так далее. Попробуй с поЗиксовым ключом.
>
>ну и так далее. Попробуй с
>поЗиксовым ключом.неа :)
Посмотрел в FreeBSD4.4. Маны есть, слово aio_read обнаружилось в /usr/lib/libc.a
Я прогрепал весь /usr/lib - и нашел таки. /usr/lib/librt.a Соответственно ключ -lrt - и все собралось.
Спасибо за помощь.
>>
>>ну и так далее. Попробуй с
>>поЗиксовым ключом.
>
>неа :)
>
>Посмотрел в FreeBSD4.4. Маны есть, слово
>aio_read обнаружилось в /usr/lib/libc.aТо есть вот это, ниже - это про мой линукс, не про фрю :)
/usr/lib/librt.a Соответственно ключ -lrt