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

# MMap

Create memory map of a file

## Declaration

Source position: oldlinux.pp line 1545

`function MMap(`
`const m: tmmapargs`
`):LongInt;`

## Description

MMap maps or unmaps files or devices into memory. The different fields of the argument m determine what and how the mmap maps this:

address
  Address where to mmap the device. This address is a hint, and may not be followed.
size
  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.
offset
  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 LinuxError is set to the error code:

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

MUnMap |  | Unmap previously mapped memory block

## Example

    Program Example66;

    { Program to demonstrate the MMap function. }

    Uses oldlinux;

    Var S : String;
        fd,Len : Longint;
        args : tmmapargs;
        P : PChar;

    begin
      S:='This is a string'#0;
      Len:=Length(S);
      fd:=fdOpen('testfile.txt',Open_wrOnly or open_creat);
      If fd=-1 then
        Halt(1);
      If fdWrite(fd,S[1],Len)=-1 then
        Halt(2);
      fdClose(fd);
      fdOpen('testfile.txt',Open_rdOnly);
      if fd=-1 then
        Halt(3);
      args.address:=0;
      args.offset:=0;
      args.size:=Len+1;
      args.fd:=Fd;
      args.flags:=MAP_PRIVATE;
      args.prot:=PROT_READ or PROT_WRITE;
      P:=Pchar(mmap(args));
      If longint(P)=-1 then
        Halt(4);
      Writeln('Read in memory  :',P);
      fdclose(fd);
      if Not MUnMap(P,Len) Then
        Halt(LinuxError);
    end.

Documentation generated on: Feb 26 2014