Fpmmap function
Create memory map of a file.
Declaration
function Fpmmap(start: pointer; len: size_t; prot: cint; flags: cint;
fd: cint; offst: off_t): pointerDescription
FpMMap maps or unmaps files or devices into memory. The different
arguments determine what and how the file is mapped:
- adr
- Address where to mmap the device. This address is a hint, and may not be followed.
- len
- Size (in bytes) of area to be mapped.
- prot
-
Protection of mapped memory. This is a OR-ed combination of the following constants:
- PROT_EXEC
- The memory can be executed.
- PROT_READ
- The memory can be read.
- PROT_WRITE
- The memory can be written.
- PROT_NONE
- The memory can not be accessed.
- flags
-
Contains some options for the mmap call. It is an OR-ed combination of the following constants:
- MAP_FIXED
- Do not map at another address than the given address. If the
address cannot be used,
MMapwill fail. - MAP_SHARED
- Share this map with other processes that map this object.
- MAP_PRIVATE
- Create a private map with copy-on-write semantics.
- MAP_ANONYMOUS
-
fddoes not have to be a file descriptor.
One of the options
MAP_SHAREDandMAP_PRIVATEmust be present, but not both at the same time. - fd
- File descriptor from which to map.
- off
- Offset to be used in file descriptor
fd.
The function returns a pointer to the mapped memory, or a -1 in case of en error.
Errors
On error, -1 is returned and extended error information is returned by the FpGetErrno function.
- Sys_EBADF
-
fdis not a valid file descriptor andMAP_ANONYMOUSwas not specified. - Sys_EACCES
-
MAP_PRIVATEwas specified, butfdis not open for reading. OrMAP_SHAREDwas asked andPROT_WRITEis set, fd is not open for writing - Sys_EINVAL
- One of the record fields
Start,lengthoroffsetis invalid. - Sys_ETXTBUSY
-
MAP_DENYWRITEwas set but the object specified by fd is open for writing. - Sys_EAGAIN
-
fdis locked, or too much memory is locked. - Sys_ENOMEM
- Not enough memory for this operation.
See also
Example: ex66
Program Example66;
{ Program to demonstrate the MMap function. }
Uses BaseUnix,Unix;
Var S : String;
fd : cint;
Len : longint;
// args : tmmapargs;
P : PChar;
begin
s:='This is the string';
Len:=Length(S);
fd:=fpOpen('testfile.txt',O_wrOnly or o_creat);
If fd=-1 then
Halt(1);
If fpWrite(fd,S[1],Len)=-1 then
Halt(2);
fpClose(fd);
fd:=fpOpen('testfile.txt',O_rdOnly);
if fd=-1 then
Halt(3);
P:=Pchar(fpmmap(nil,len+1 ,PROT_READ or PROT_WRITE,MAP_PRIVATE,fd,0));
If longint(P)=-1 then
Halt(4);
Writeln('Read in memory :',P);
fpclose(fd);
if fpMUnMap(P,Len)<>0 Then
Halt(fpgeterrno);
end.An experiment, built from development snapshots. Not the official Free Pascal or Lazarus documentation.
