Раз уж обсуждаем как правильно читать файлы, то у меня есть один давний вопрос.
Какие есть кроссплатформенные варианты mmap'нуть файлик в память? Есть ли библиотечки, не использующие class'ы и «тяжёлый» rtl типа SysUtils?
Модератор: Модераторы
man msync
MSYNC(2) Руководство программиста Linux MSYNC(2)
ИМЯ
msync - синхронизирует содержимое файла с его отображением в памяти
ОБЗОР
#include <sys/mman.h>
int msync(void *addr, size_t length, int flags);
ОПИСАНИЕ
Вызов msync() сбрасывает изменения файла, который отображён в память с помощью mmap(2), обратно в файловую систему. Без использования этого вызова нет никакой гарантии, что изменения будут записаны в файл до
вызова munmap(2). Если быть точнее, то на диск записывается часть файла, начинающаяся в памяти с адреса addr длиной length.
В аргументе flags должен быть один из флагов MS_ASYNC и MS_SYNC, а также дополнительно можно указать MS_INVALIDATE. Данные биты имеют следующее значение:
MS_ASYNC
Запланировать обновление, но вызов завершается сразу.
MS_SYNC
Запланировать обновление и ждать его завершения.
MS_INVALIDATE
Считать недействительными другие отображения того же файла (для того, чтобы они могли обновиться до достоверных значений, которые запишутся).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ
EBUSY В flags указан MS_INVALIDATE, но на указанный адресный диапазон есть блокировка в памяти.
EINVAL Значение addr не кратно PAGESIZE; в flags установлен любой другой бит, отличный от MS_ASYNC | MS_INVALIDATE | MS_SYNC; в flags установлены сразу MS_SYNC и MS_ASYNC.
ENOMEM Указанная память (или её часть) не была отображена.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
Этот вызов появился в Linux 1.3.21, и в нём использовалось EFAULT вместо ENOMEM. В Linux 2.4.19 это было изменено на значение POSIX ENOMEM.
ДОСТУПНОСТЬ
В системах POSIX, в которых доступен msync(), значения _POSIX_MAPPED_FILES и _POSIX_SYNCHRONIZED_IO, определённые в <unistd.h>, больше нуля. (См. также sysconf(3).)
ЗАМЕЧАНИЯ
Согласно POSIX, в flags должен быть указан или MS_SYNC, или MS_ASYNC и отказ включить один из этих флагов вызывает ошибку в msync() на некоторых системах. Однако Linux позволяет вызывать msync() без этих флагов,
используя семантику, которая (в настоящее время) эквивалентна указанию MS_ASYNC (начиная с Linux 2.6.19, MS_ASYNC, фактически, ничего не делает, так как ядро правильно отслеживает грязные страницы и записывает их
в место хранения при необходимости). Несмотря на поведение Linux, в переносимых, ориентированных на будущее приложениях в flags должен быть указан или MS_SYNC, или MS_ASYNC.
СМОТРИТЕ ТАКЖЕ
mmap(2)
B.O. Gallmeister, POSIX.4, O'Reilly, стр. 128-129 и 389-391.
Linux 2015-08-08 MSYNC(2)
egrep -r 'MS_ASYNC|MS_SYNC|MS_INVALIDATE' /usr/include
/usr/include/asm-generic/mman-common.h:#define MS_ASYNC 1 /* sync memory asynchronously */
/usr/include/asm-generic/mman-common.h:#define MS_INVALIDATE 2 /* invalidate the caches */
/usr/include/asm-generic/mman-common.h:#define MS_SYNC 4 /* synchronous memory sync */
/usr/include/sys/mount.h: MS_SYNCHRONOUS = 16, /* Writes are synced at once. */
/usr/include/sys/mount.h:#define MS_SYNCHRONOUS MS_SYNCHRONOUS
/usr/include/sys/mount.h:#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION \
/usr/include/boost/interprocess/mapped_region.hpp: return msync(addr, numbytes, async ? MS_ASYNC : MS_SYNC) == 0;
/usr/include/bits/mman-linux.h:#define MS_ASYNC 1 /* Sync memory asynchronously. */
/usr/include/bits/mman-linux.h:#define MS_SYNC 4 /* Synchronous memory sync. */
/usr/include/bits/mman-linux.h:#define MS_INVALIDATE 2 /* Invalidate the caches. */
/usr/include/linux/fs.h:#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
/usr/include/linux/fs.h:#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|\
/usr/include/libmount/libmount.h:#ifndef MS_SYNCHRONOUS
/usr/include/libmount/libmount.h:#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
egrep -r 'MS_ASYNC|MS_SYNC|MS_INVALIDATE' .
./rtl/unix/unix.pp: MS_ASYNC = 1 deprecated; { Sync memory asynchronously. }
./rtl/unix/unix.pp: MS_SYNC = 4 deprecated; { Synchronous memory sync. }
./rtl/unix/unix.pp: MS_INVALIDATE = 2 deprecated; { Invalidate the caches. }
./packages/libc/src/bmmanh.inc: MS_ASYNC = 1;
./packages/libc/src/bmmanh.inc: MS_SYNC = 4;
./packages/libc/src/bmmanh.inc: MS_INVALIDATE = 2;
./packages/libc/src/smounth.inc: MS_SYNCHRONOUS = 16;
grep -r 'msync' .
./rtl/netbsd/sysnr.inc: syscall_nr_compat_12_msync = 65;
./rtl/netbsd/sysnr.inc: { syscall: "__msync13" ret: "int" args: "void " "size_t" "int" }
./rtl/netbsd/sysnr.inc: syscall_nr___msync13 = 277;
./rtl/dragonfly/sysnr.inc: syscall_nr_msync = 65;
./rtl/dragonfly/sysnr.inc: syscall_nr_netbsd_msync = 277;
./rtl/unix/unix.pp:{ Flags to `msync'. There is non msync() call in this unit?
./rtl/linux/arm/sysnr.inc: syscall_nr_msync = syscall_nr_base+144;
./rtl/linux/i386/sysnr.inc: syscall_nr_msync = 144;
./rtl/linux/oldlinux.pp: syscall_nr_msync = 144;
./rtl/linux/sparc/sysnr.inc: syscall_nr_msync = 65 ; // Common in newer 1.3.x revs...
./rtl/linux/mips/sysnr.inc: syscall_nr_msync = 4000+144;
./rtl/linux/m68k/sysnr.inc: syscall_nr_msync = 144;
./rtl/linux/powerpc/sysnr.inc: syscall_nr_msync = 144;
./rtl/linux/x86_64/sysnr.inc: syscall_nr_msync = 26;
./rtl/netwlibc/libc.pp:{ 'flags' values for msync()... }
./rtl/netwlibc/libc.imp: msync,
./rtl/openbsd/sysnr.inc:(* 65 *) syscall_nr_msync_20 = 65; (* up to 2.2 release *)
./rtl/openbsd/sysnr.inc:(* 65 *) syscall_nr_omsync = 65; (* from 2.3 up to 3.3 release *)
./rtl/openbsd/sysnr.inc:(* 256 *) syscall_nr_msync = 256;
./packages/morphunits/src/hardware.pas: beamsync : SmallInt;
./packages/amunits/src/coreunits/hardware.pas: beamsync : smallint;
./packages/libc/src/smmaph.inc:function msync(__addr:pointer; __len:size_t; __flags:longint):longint;cdecl;external clib name 'msync';
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13