123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- %
- % $Id$
- % This file is part of the FPC documentation.
- % Copyright (C) 1998, by Michael Van Canneyt
- %
- % The FPC documentation is free text; you can redistribute it and/or
- % modify it under the terms of the GNU Library General Public License as
- % published by the Free Software Foundation; either version 2 of the
- % License, or (at your option) any later version.
- %
- % The FPC Documentation is distributed in the hope that it will be useful,
- % but WITHOUT ANY WARRANTY; without even the implied warranty of
- % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- % Library General Public License for more details.
- %
- % You should have received a copy of the GNU Library General Public
- % License along with the FPC documentation; see the file COPYING.LIB. If not,
- % write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- % Boston, MA 02111-1307, USA.
- %
- \chapter{The IPC unit.}
- \label{ch:ipcunit}
- \FPCexampledir{ipcex}
- This chapter describes the IPC unit for Free Pascal. It was written for
- \linux by Micha\"el Van Canneyt. It gives all the functionality of system V
- Inter-Process Communication: shared memory, semaphores and messages.
- It works only on the \linux operating system.
- The chapter is divided in 2 sections:
- \begin{itemize}
- \item The first section lists types, constants and variables from the
- interface part of the unit.
- \item The second section describes the functions defined in the unit.
- \end{itemize}
- \section {Types, Constants and variables : }
- \subsection{Variables}
- \begin{verbatim}
- Var
- IPCerror : longint;
- \end{verbatim}
- The \var{IPCerror} variable is used to report errors, by all calls.
- \subsection{Constants}
- Many constants here are provided for completeness only, and should under
- normal circumstances not be used by the programmer.
- \begin{verbatim}
- Const
- IPC_CREAT = 1 shl 9; { create if key is nonexistent }
- IPC_EXCL = 2 shl 9; { fail if key exists }
- IPC_NOWAIT = 4 shl 9; { return error on wait }
- \end{verbatim}
- These constants are used in the various \var{xxxget} calls.
- \begin{verbatim}
- IPC_RMID = 0; { remove resource }
- IPC_SET = 1; { set ipc_perm options }
- IPC_STAT = 2; { get ipc_perm options }
- IPC_INFO = 3; { see ipcs }
- \end{verbatim}
- These constants can be passed to the various \var{xxxctl} calls.
- \begin{verbatim}
- const
- MSG_NOERROR = 1 shl 12;
- MSG_EXCEPT = 2 shl 12;
- MSGMNI = 128;
- MSGMAX = 4056;
- MSGMNB = 16384;
- \end{verbatim}
- These constants are used in the messaging system, they are not for use by
- the programmer.
- \begin{verbatim}
- const
- SEM_UNDO = $1000;
- GETPID = 11;
- GETVAL = 12;
- GETALL = 13;
- GETNCNT = 14;
- GETZCNT = 15;
- SETVAL = 16;
- SETALL = 17;
- \end{verbatim}
- These constants call be specified in the \seef{semop} call.
- \begin{verbatim}
- SEMMNI = 128;
- SEMMSL = 32;
- SEMMNS = (SEMMNI * SEMMSL);
- SEMOPM = 32;
- SEMVMX = 32767;
- \end{verbatim}
- These constanst are used internally by the semaphore system, they should not
- be used by the programmer.
- \begin{verbatim}
- const
- SHM_R = 4 shl 6;
- SHM_W = 2 shl 6;
- SHM_RDONLY = 1 shl 12;
- SHM_RND = 2 shl 12;
- SHM_REMAP = 4 shl 12;
- SHM_LOCK = 11;
- SHM_UNLOCK = 12;
- \end{verbatim}
- These constants are used in the \seef{shmctl} call.
- \subsection{Types}
- The following two types are provided because they are needed. One they they
- should be defined in the system unit, however.
- \begin{verbatim}
- Type
- PULong = ^Cardinal;
- PWord = ^Word;
- \end{verbatim}
- \begin{verbatim}
- Type
- TKey = Longint;
- \end{verbatim}
- \var{TKey} is the type returned by the \seef{ftok} key generating function.
- \begin{verbatim}
- type
- PIPC_Perm = ^TIPC_Perm;
- TIPC_Perm = record
- key : TKey;
- uid,
- gid,
- cuid,
- cgid,
- mode,
- seq : Word;
- end;
- \end{verbatim}
- The \var{TIPC\_Perm} structure is used in all IPC systems to specify the
- permissions.
- \begin{verbatim}
- Type
- PSHMid_DS = ^TSHMid_ds;
- TSHMid_ds = record
- shm_perm : TIPC_Perm;
- shm_segsz : longint;
- shm_atime : longint;
- shm_dtime : longint;
- shm_ctime : longint;
- shm_cpid : word;
- shm_lpid : word;
- shm_nattch : integer;
- shm_npages : word;
- shm_pages : Pointer;
- attaches : pointer;
- end;
- \end{verbatim}
- The \var{TSHMid\_ds} strucure is used in the \seef{shmctl} call to set or
- retrieve settings concerning shared memory.
- \begin{verbatim}
- type
- PSHMinfo = ^TSHMinfo;
- TSHMinfo = record
- shmmax : longint;
- shmmin : longint;
- shmmni : longint;
- shmseg : longint;
- shmall : longint;
- end;
- \end{verbatim}
- The \var{TSHMinfo} record is used by the shared memory system, and should
- not be accessed by the programer directly.
- \begin{verbatim}
- type
- PMSG = ^TMSG;
- TMSG = record
- msg_next : PMSG;
- msg_type : Longint;
- msg_spot : PChar;
- msg_stime : Longint;
- msg_ts : Integer;
- end;
- \end{verbatim}
- The \var{TMSG} record is used in the handling of message queues. There
- should be few cases where the programmer needs to access this data.
- \begin{verbatim}
- type
- PMSQid_ds = ^TMSQid_ds;
- TMSQid_ds = record
- msg_perm : TIPC_perm;
- msg_first : PMsg;
- msg_last : PMsg;
- msg_stime : Longint;
- msg_rtime : Longint;
- msg_ctime : Longint;
- wwait : Pointer;
- rwait : pointer;
- msg_cbytes : word;
- msg_qnum : word;
- msg_qbytes : word;
- msg_lspid : word;
- msg_lrpid : word;
- end;
- \end{verbatim}
- The \var{TMSQid\_ds} record is returned by the \seef{msgctl} call, and
- contains all data about a message queue.
- \begin{verbatim}
- PMSGbuf = ^TMSGbuf;
- TMSGbuf = record
- mtype : longint;
- mtext : array[0..0] of char;
- end;
- \end{verbatim}
- The \var{TMSGbuf} record is a record containing the data of a record. you
- should never use this record directly, instead you should make your own
- record that follows the structure of the \var{TMSGbuf} record, but that has
- a size that is big enough to accomodate your messages. The \var{mtype} field
- should always be present, and should always be filled.
- \begin{verbatim}
- Type
- PMSGinfo = ^TMSGinfo;
- TMSGinfo = record
- msgpool : Longint;
- msgmap : Longint;
- msgmax : Longint;
- msgmnb : Longint;
- msgmni : Longint;
- msgssz : Longint;
- msgtql : Longint;
- msgseg : Word;
- end;
- \end{verbatim}
- The \var{TMSGinfo} record is used internally by the message queue system,
- and should not be used by the programmer directly.
- \begin{verbatim}
- Type
- PSEMid_ds = ^PSEMid_ds;
- TSEMid_ds = record
- sem_perm : tipc_perm;
- sem_otime : longint;
- sem_ctime : longint;
- sem_base : pointer;
- sem_pending : pointer;
- sem_pending_last : pointer;
- undo : pointer;
- sem_nsems : word;
- end;
- \end{verbatim}
- The \var{TSEMid\_ds} structure is returned by the \seef{semctl} call, and
- contains all data concerning a semahore.
- \begin{verbatim}
- Type
- PSEMbuf = ^TSEMbuf;
- TSEMbuf = record
- sem_num : word;
- sem_op : integer;
- sem_flg : integer;
- end;
- \end{verbatim}
- The \var{TSEMbuf} record us use in the \seef{semop} call, and is used to
- specify which operations you want to do.
- \begin{verbatim}
- Type
- PSEMinfo = ^TSEMinfo;
- TSEMinfo = record
- semmap : longint;
- semmni : longint;
- semmns : longint;
- semmnu : longint;
- semmsl : longint;
- semopm : longint;
- semume : longint;
- semusz : longint;
- semvmx : longint;
- semaem : longint;
- end;
- \end{verbatim}
- The \var{TSEMinfo} record is used internally by the semaphore system, and
- should not be used directly.
- \begin{verbatim}
- Type
- PSEMun = ^TSEMun;
- TSEMun = record
- case longint of
- 0 : ( val : longint );
- 1 : ( buf : PSEMid_ds );
- 2 : ( arr : PWord );
- 3 : ( padbuf : PSeminfo );
- 4 : ( padpad : pointer );
- end;
- \end{verbatim}
- The \var{TSEMun} variant record (actually a C union) is used in the
- \seef{semctl} call.
-
- \section{Functions and procedures}
- \begin{function}{ftok}
- \Declaration
- Function ftok (Path : String; ID : char) : TKey;
- \Description
- \var{ftok} returns a key that can be used in a \seef{semget},\seef{shmget}
- or \seef{msgget} call to access a new or existing IPC resource.
- \var{Path} is the name of a file in the file system, \var{ID} is a
- character of your choice. The ftok call does the same as it's C couterpart,
- so a pascal program and a C program will access the same resource if
- they use the same \var{Path} and \var{ID}
- \Errors
- \var{ftok} returns -1 if the file in \var{Path} doesn't exist.
- \SeeAlso
- \seef{semget},\seef{shmget},\seef{msgget}
- \end{function}
- For an example, see \seef{msgctl}, \seef{semctl}, \seef{shmctl}.
- \begin{function}{msgget}
- \Declaration
- Function msgget(key: TKey; msgflg:longint):longint;
- \Description
- \var{msgget} returns the ID of the message queue described by \var{key}.
- Depending on the flags in \var{msgflg}, a new queue is created.
- \var{msgflg} can have one or more of the following values (combined by ORs):
- \begin{description}
- \item[IPC\_CREAT] The queue is created if it doesn't already exist.
- \item[IPC\_EXCL] If used in combination with \var{IPC\_CREAT}, causes the
- call to fail if the queue already exists. It cannot be used by itself.
- \end{description}
- Optionally, the flags can be \var{OR}ed with a permission mode, which is the
- same mode that can be used in the file system.
- \Errors
- On error, -1 is returned, and \var{IPCError} is set.
- \SeeAlso
- \seef{ftok},\seef{msgsnd}, \seef{msgrcv}, \seef{msgctl}, \seem{semget}{2}
- \end{function}
- For an example, see \seef{msgctl}.
- \begin{function}{msgsnd}
- \Declaration
- Function msgsnd(msqid:longint; msgp: PMSGBuf; msgsz: longint; msgflg:longint): Boolean;
- \Description
- \var{msgsend} sends a message to a message queue with ID \var{msqid}.
- \var{msgp} is a pointer to a message buffer, that should be based on the
- \var{TMsgBuf} type. \var{msgsiz} is the size of the message (NOT of the
- message buffer record !)
- The \var{msgflg} can have a combination of the following values (ORed
- together):
- \begin{description}
- \item [0] No special meaning. The message will be written to the queue.
- If the queue is full, then the process is blocked.
- \item [IPC\_NOWAIT] If the queue is full, then no message is written,
- and the call returns immediatly.
- \end{description}
- The function returns \var{True} if the message was sent successfully,
- \var{False} otherwise.
- \Errors
- In case of error, the call returns \var{False}, and \var{IPCerror} is set.
- \SeeAlso
- \seef{msgget}, \seef{msgrcv}, seef{msgctl}
- \end{function}
- For an example, see \seef{msgctl}.
- \begin{function}{msgrcv}
- \Declaration
- Function msgrcv(msqid:longint; msgp: PMSGBuf; msgsz: longint; msgtyp:longint; msgflg:longint): Boolean;
- \Description
- \var{msgrcv} retrieves a message of type \var{msgtyp} from the message
- queue with ID \var{msqid}. \var{msgtyp} corresponds to the \var{mtype}
- field of the \var{TMSGbuf} record. The message is stored in the \var{MSGbuf}
- structure pointed to by \var{msgp}.
- The \var{msgflg} parameter can be used to control the behaviour of the
- \var{msgrcv} call. It consists of an ORed combination of the following
- flags:
- \begin{description}
- \item [0] No special meaning.
- \item [IPC\_NOWAIT] if no messages are available, then the call returns
- immediatly, with the \var{ENOMSG} error.
- \item [MSG\_NOERROR] If the message size is wrong (too large),
- no error is generated, instead the message is truncated.
- Normally, in such cases, the call returns an error (E2BIG)
- \end{description}
- The function returns \var{True} if the message was received correctly,
- \var{False} otherwise.
- \Errors
- In case of error, \var{False} is returned, and \var{IPCerror} is set.
- \SeeAlso
- \seef{msgget}, \seef{msgsnd}, \seef{msgctl}
- \end{function}
- For an example, see \seef{msgctl}.
- \begin{function}{msgctl}
- \Declaration
- Function msgctl(msqid:longint; cmd: longint; buf: PMSQid\_ds): Boolean;
- \Description
- \var{msgctl} performs various operations on the message queue with id
- \var{ID}. Which operation is performed, depends on the \var{cmd}
- parameter, which can have one of the following values:
- \begin{description}
- \item[IPC\_STAT] In this case, the \var{msgctl} call fills the
- \var{TMSQid\_ds} structure with information about the message queue.
- \item[IPC\_SET] in this case, the \var{msgctl} call sets the permissions
- of the queue as specified in the \var{ipc\_perm} record inside \var{buf}.
- \item[IPC\_RMID] If this is specified, the message queue will be removed
- from the system.
- \end{description}
- \var{buf} contains the data that are needed by the call. It can be
- \var{Nil} in case the message queue should be removed.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- On error, \var{False} is returned, and \var{IPCerror} is set accordingly.
- \SeeAlso
- \seef{msgget}, \seef{msgsnd}, \seef{msgrcv}
- \end{function}
- \FPCexample{msgtool}
- \begin{function}{semget}
- \Declaration
- Function semget(key:Tkey; nsems:longint; semflg:longint): longint;
- \Description
- \var{msgget} returns the ID of the semaphore set described by \var{key}.
- Depending on the flags in \var{semflg}, a new queue is created.
- \var{semflg} can have one or more of the following values (combined by ORs):
- \begin{description}
- \item[IPC\_CREAT] The queue is created if it doesn't already exist.
- \item[IPC\_EXCL] If used in combination with \var{IPC\_CREAT}, causes the
- call to fail if the set already exists. It cannot be used by itself.
- \end{description}
- Optionally, the flags can be \var{OR}ed with a permission mode, which is the
- same mode that can be used in the file system.
- if a new set of semaphores is created, then there will be \var{nsems}
- semaphores in it.
- \Errors
- On error, -1 is returned, and \var{IPCError} is set.
- \SeeAlso
- \seef{ftok}, \seef{semop}, \seef{semctl}
- \end{function}
- \begin{function}{semop}
- \Declaration
- Function semop(semid:longint; sops: pointer; nsops: cardinal): Boolean;
- \Description
- \var{semop} performs a set of operations on a message queue.
- \var{sops} points to an array of type \var{TSEMbuf}. The array should
- contain \var{nsops} elements.
- The fields of the \var{TSEMbuf} structure
- \begin{verbatim}
- TSEMbuf = record
- sem_num : word;
- sem_op : integer;
- sem_flg : integer;
- \end{verbatim}
- should be filled as follows:
- \begin{description}
- \item[sem\_num] The number of the semaphore in the set on which the
- operation must be performed.
- \item[sem\_op] The operation to be performed. The operation depends on the
- sign of \var{sem\_op}
- \begin{enumerate}
- \item A positive number is simply added to the current value of the
- semaphore.
- \item If 0 (zero) is specified, then the process is suspended until the
- specified semaphore reaches zero.
- \item If a negative number is specified, it is substracted from the
- current value of the semaphore. If the value would become negative
- then the process is suspended until the value becomes big enough, unless
- \var{IPC\_NOWAIT} is specified in the \var{sem\_flg}.
- \end{enumerate}
- \item[sem\_flg] Optional flags: if \var{IPC\_NOWAIT} is specified, then the
- calling process will never be suspended.
- \end{description}
- The function returns \var{True} if the operations were successful,
- \var{False} otherwise.
- \Errors
- In case of error, \var{False} is returned, and \var{IPCerror} is set.
- \SeeAlso
- \seef{semget}, \seef{semctl}
- \end{function}
- \begin{function}{semctl}
- \Declaration
- Function semctl(semid:longint; semnum:longint; cmd:longint; var arg: tsemun): longint;
- \Description
- \var{semctl} performs various operations on the semaphore \var{semnum} w
- ith semaphore set id \var{ID}.
- The \var{arg} parameter supplies the data needed for each call. This is
- a variant record that should be filled differently, according to the
- command:
- \begin{verbatim}
- Type
- TSEMun = record
- case longint of
- 0 : ( val : longint );
- 1 : ( buf : PSEMid_ds );
- 2 : ( arr : PWord );
- 3 : ( padbuf : PSeminfo );
- 4 : ( padpad : pointer );
- end;
- \end{verbatim}
- Which operation is performed, depends on the \var{cmd}
- parameter, which can have one of the following values:
- \begin{description}
- \item[IPC\_STAT] In this case, the arg record should have it's \var{buf}
- field set to the address of a \var{TSEMid\_ds} record.
- The \var{semctl} call fills this \var{TSEMid\_ds} structure with information
- about the semaphore set.
- \item[IPC\_SET] In this case, the \var{arg} record should have it's \var{buf}
- field set to the address of a \var{TSEMid\_ds} record.
- The \var{semctl} call sets the permissions of the queue as specified in
- the \var{ipc\_perm} record.
- \item[IPC\_RMID] If this is specified, the semaphore set is removed from
- from the system.
- \item[GETALL] In this case, the \var{arr} field of \var{arg} should point
- to a memory area where the values of the semaphores will be stored.
- The size of this memory area is \var{SizeOf(Word)* Number of semaphores
- in the set}.
- This call will then fill the memory array with all the values of the
- semaphores.
- \item[GETNCNT] This will fill the \var{val} field of the \var{arg} union
- with the bumber of processes waiting for resources.
- \item[GETPID] \var{semctl} returns the process ID of the process that
- performed the last \seef{semop} call.
- \item[GETVAL] \var{semctl} returns the value of the semaphore with number
- \var{semnum}.
- \item[GETZCNT] \var{semctl} returns the number of processes waiting for
- semaphores that reach value zero.
- \item[SETALL] In this case, the \var{arr} field of \var{arg} should point
- to a memory area where the values of the semaphores will be retrieved from.
- The size of this memory area is \var{SizeOf(Word)* Number of semaphores
- in the set}.
- This call will then set the values of the semaphores from the memory array.
- \item[SETVAL] This will set the value of semaphore \var{semnum} to the value
- in the \var{val} field of the \var{arg} parameter.
- \end{description}
- The function returns -1 on error.
- \Errors
- The function returns -1 on error, and \var{IPCerror} is set accordingly.
- \SeeAlso
- \seef{semget}, \seef{semop}
- \end{function}
- \FPCexample{semtool}
- \begin{function}{shmget}
- \Declaration
- Function shmget(key: Tkey; Size:longint; flag:longint):longint;
- \Description
- \var{shmget} returns the ID of a shared memory block, described by \var{key}.
- Depending on the flags in \var{flag}, a new memory block is created.
- \var{flag} can have one or more of the following values (combined by ORs):
- \begin{description}
- \item[IPC\_CREAT] The queue is created if it doesn't already exist.
- \item[IPC\_EXCL] If used in combination with \var{IPC\_CREAT}, causes the
- call to fail if the queue already exists. It cannot be used by itself.
- \end{description}
- Optionally, the flags can be \var{OR}ed with a permission mode, which is the
- same mode that can be used in the file system.
- if a new memory block is created, then it will have size \var{Size}
- semaphores in it.
- \Errors
- On error, -1 is returned, and \var{IPCError} is set.
- \SeeAlso
- \end{function}
- \begin{function}{shmat}
- \Declaration
- Function shmat (shmid:longint; shmaddr:pchar; shmflg:longint):pchar;
- \Description
- \var{shmat} attaches a shared memory block with identified \var{shmid}
- to the current process. The function returns a pointer to the shared memory
- block.
- If \var{shmaddr} is \var{Nil}, then the system chooses a free unmapped
- memory region, as high up in memory space as possible.
- If \var{shmaddr} is non-nil, and \var{SHM\_RND} is in \var{shmflg}, then
- the returned address is \var{shmaddr}, rounded down to \var{SHMLBA}.
- If \var{SHM\_RND} is not specified, then \var{shmaddr} must be a
- page-aligned address.
- The parameter \var{shmflg} can be used to control the behaviour of the
- \var{shmat} call. It consists of a ORed combination of the following
- costants:
- \begin{description}
- \item[SHM\_RND] The suggested address in \var{shmaddr} is rounded down to
- \var{SHMLBA}.
- \item[SHM\_RDONLY] the shared memory is attached for read access only.
- Otherwise the memory is attached for read-write. The process then needs
- read-write permissions to access the shared memory.
- \end{description}
- \Errors
- If an error occurs, -1 is returned, and \var{IPCerror} is set.
- \SeeAlso
- \seef{shmget}, \seef{shmdt}, \seef{shmctl}
- \end{function}
- For an example, see \seef{shmctl}.
- \begin{function}{shmdt}
- \Declaration
- Function shmdt (shmaddr:pchar):boolean;
- \Description
- \var{shmdt} detaches the shared memory at address \var{shmaddr}. This shared
- memory block is unavailable to the current process, until it is attached
- again by a call to \seef{shmat}.
- The function returns \var{True} if the memory block was detached
- successfully, \var{False} otherwise.
- \Errors
- On error, False is returned, and IPCerror is set.
- \SeeAlso
- \seef{shmget}, \seef{shmat}, \seef{shmctl}
- \end{function}
- \begin{function}{shmctl}
- \Declaration
- Function shmctl(shmid:longint; cmd:longint; buf: pshmid\_ds): Boolean;
- \Description
- \var{shmctl} performs various operations on the shared memory block
- identified by identifier \var{shmid}.
- The \var{buf} parameter points to a \var{TSHMid\_ds} record. The
- \var{cmd} parameter is used to pass which operation is to be performed.
- It can have one of the following values :
- \begin{description}
- \item[IPC\_STAT] \var{shmctl} fills the \var{TSHMid\_ds} record that
- \var{buf} points to with the available information about the shared memory
- block.
- \item[IPC\_SET] applies the values in the \var{ipc\_perm} record that
- \var{buf} points to, to the shared memory block.
- \item[IPC\_RMID] the shared memory block is destroyed (after all processes
- to which the block is attached, have detached from it).
- \end{description}
- If successful, the function returns \var{True}, \var{False} otherwise.
- \Errors
- If an error occurs, the function returns \var{False}, and \var{IPCerror}
- is set.
- \SeeAlso
- \seef{shmget}, \seef{shmat}, \seef{shmdt}
- \end{function}
- \FPCexample{shmtool}
|