[Overview][Constants][Types][Procedures and functions][Index] | Reference for unit 'BaseUnix' (#rtl)

# 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

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.