читать из файла при разных смещениях в linux - PullRequest
2 голосов
/ 03 ноября 2011

Возможно ли чтение из файла с разными смещениями в одном системном вызове (без поиска между ними), как в случае ввода-вывода с перекрытием окон?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

Вы не можете сделать это за один системный вызов, но вы можете сделать это без поиска * с помощью системного вызова pread(2).Этот системный вызов принимает смещение от начала файла, из которого считываются данные.Это позволяет читать из файлового дескриптора без изменения текущего смещения.lseek(2) изменит текущее смещение.

* Я различаю поиск диска и поиск ОС.Чтение последовательных блоков в файле может привести или не привести к поиску на диске.Операционный поиск изменяет текущее смещение файла для следующей позиции чтения / записи.

1 голос
/ 03 ноября 2011

Системные вызовы readv и writev - это вызовы "scatter read" и "collect write", и если я понимаю ваш вопрос, делайте что хотите. Страница man короткая, но должна быть достаточной.

Изменить: Я неправильно прочитал вопрос, как указано в комментариях. То, что запрашивается, больше похоже на preadv, который (наряду с его параллельной pwritev) был представлен в Linux 2.6.30 и описан в http://lwn.net/Articles/164887/

Дальнейшее редактирование: ранее я думал, что расширения iovec превратили его в preadv / pwritev, но они этого не сделали: см. http://www.kernel.org/doc/man-pages/online/pages/man2/readv.2.html

1 голос
/ 03 ноября 2011

Ваш вопрос не имеет смысла.Перекрытый ввод-вывод Windows - это просто асинхронный метод чтения (в данном случае) файла.Он позволяет вашему потоку делать что-то еще, ожидая завершения ввода-вывода.

Вы не можете использовать его для чтения нескольких разделов файла без промежуточных поисков за один вызов.

Вы можете использовать его для одновременного одновременного доступа, но вам нужно каждый раз указывать, какой сегмент файла вы хотите (другими словами, неявный поиск), кроме васнужно сделать это как несколько вызовов, по одному на сегмент.

Если вы хотите асинхронный ввод / вывод под Linux, DeveloperWorks предлагает интересную статью о aio stuff здесь , доступном от Kernelначиная с версии 2.6.

Имейте в виду, что асинхронный ввод-вывод (даже под Windows), вероятно, не принесет вам такой большой пользы для быстрых «устройств», таких как локальный жесткий диск.Это, вероятно, не стоит дополнительных усилий при написании кода для этого варианта использования.Он работает с относительно медленными устройствами, такими как сетевое хранилище или связь через сокеты, где вы можете выполнить довольно много работы до завершения ввода-вывода.

...