Fpmmap
Create memory map of a file
Declaration
Source position: bunxh.inc line 107
function Fpmmap(start: pointer; len: size_t; prot: cint; flags: cint;
fd: cint; offst: off_t) : pointer;
Description
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, MMap will 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
- fd does not have to be a file descriptor.
One of the options MAP_SHARED and MAP_PRIVATE must 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
- fd is not a valid file descriptor and MAP_ANONYMOUS was not specified.
- Sys_EACCES
- MAP_PRIVATE was specified, but fd is not open for reading. Or MAP_SHARED was asked and PROT_WRITE is set, fd is not open for writing
- Sys_EINVAL
- One of the record fields Start, length or offset is invalid.
- Sys_ETXTBUSY
- MAP_DENYWRITE was set but the object specified by fd is open for writing.
- Sys_EAGAIN
- fd is locked, or too much memory is locked.
- Sys_ENOMEM
- Not enough memory for this operation.
See also
Name | Description |
---|---|
FpMUnMap | Unmap previously mapped memory block |
Example
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.