.\" Copyright (c) 1993 Luigi P. Bai (lpb@softint.com) July 28, 1993
.\" and Copyright 1993 Giorgio Ciucci <giorgio@crcc.it>
.\" and Copyright 2004, 2005 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.\" Modified 1993-07-28, Rik Faith <faith@cs.unc.edu>
.\" Modified 1993-11-28, Giorgio Ciucci <giorgio@crcc.it>
.\" Modified 1997-01-31, Eric S. Raymond <esr@thyrsus.com>
.\" Modified 2001-02-18, Andries Brouwer <aeb@cwi.nl>
.\" Modified 2002-01-05, 2004-05-27, 2004-06-17,
.\"    Michael Kerrisk <mtk.manpages@gmail.com>
.\" Modified 2004-10-11, aeb
.\" Modified, Nov 2004, Michael Kerrisk <mtk.manpages@gmail.com>
.\"	Language and formatting clean-ups
.\"	Updated shmid_ds structure definitions
.\"	Added information on SHM_DEST and SHM_LOCKED flags
.\"	Noted that CAP_IPC_LOCK is not required for SHM_UNLOCK
.\"		since kernel 2.6.9
.\" Modified, 2004-11-25, mtk, notes on 2.6.9 RLIMIT_MEMLOCK changes
.\" 2005-04-25, mtk -- noted aberrant Linux behavior w.r.t. new
.\"	attaches to a segment that has already been marked for deletion.
.\" 2005-08-02, mtk: Added IPC_INFO, SHM_INFO, SHM_STAT descriptions.
.\"
.TH SHMCTL 2 2017-09-15 "Linux" "Linux Programmer's Manual"
.SH NAME
shmctl \- System V shared memory control
.SH SYNOPSIS
.ad l
.B #include <sys/ipc.h>
.br
.B #include <sys/shm.h>
.PP
.BI "int shmctl(int " shmid ", int " cmd ", struct shmid_ds *" buf );
.ad b
.SH DESCRIPTION
.BR shmctl ()
performs the control operation specified by
.I cmd
on the System\ V shared memory segment whose identifier is given in
.IR shmid .
.PP
The
.I buf
argument is a pointer to a \fIshmid_ds\fP structure,
defined in \fI<sys/shm.h>\fP as follows:
.PP
.in +4n
.EX
struct shmid_ds {
    struct ipc_perm shm_perm;    /* Ownership and permissions */
    size_t          shm_segsz;   /* Size of segment (bytes) */
    time_t          shm_atime;   /* Last attach time */
    time_t          shm_dtime;   /* Last detach time */
    time_t          shm_ctime;   /* Last change time */
    pid_t           shm_cpid;    /* PID of creator */
    pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
    shmatt_t        shm_nattch;  /* No. of current attaches */
    ...
};
.EE
.in
.PP
The
.I ipc_perm
structure is defined as follows
(the highlighted fields are settable using
.BR IPC_SET ):
.PP
.in +4n
.EX
struct ipc_perm {
    key_t          __key;    /* Key supplied to shmget(2) */
    uid_t          \fBuid\fP;      /* Effective UID of owner */
    gid_t          \fBgid\fP;      /* Effective GID of owner */
    uid_t          cuid;     /* Effective UID of creator */
    gid_t          cgid;     /* Effective GID of creator */
    unsigned short \fBmode\fP;     /* \fBPermissions\fP + SHM_DEST and
                                SHM_LOCKED flags */
    unsigned short __seq;    /* Sequence number */
};
.EE
.in
.PP
Valid values for
.I cmd
are:
.TP 10
.B IPC_STAT
Copy information from the kernel data structure associated with
.I shmid
into the
.I shmid_ds
structure pointed to by \fIbuf\fP.
The caller must have read permission on the
shared memory segment.
.TP
.B IPC_SET
Write the values of some members of the
.I shmid_ds
structure pointed to by
.I buf
to the kernel data structure associated with this shared memory segment,
updating also its
.I shm_ctime
member.
The following fields can be changed:
\fIshm_perm.uid\fP, \fIshm_perm.gid\fP,
and (the least significant 9 bits of) \fIshm_perm.mode\fP.
The effective UID of the calling process must match the owner
.RI ( shm_perm.uid )
or creator
.RI ( shm_perm.cuid )
of the shared memory segment, or the caller must be privileged.
.TP
.B IPC_RMID
Mark the segment to be destroyed.
The segment will actually be destroyed
only after the last process detaches it (i.e., when the
.I shm_nattch
member of the associated structure
.I shmid_ds
is zero).
The caller must be the owner or creator of the segment, or be privileged.
The
.I buf
argument is ignored.
.IP
If a segment has been marked for destruction, then the (nonstandard)
.B SHM_DEST
flag of the
.I shm_perm.mode
field in the associated data structure retrieved by
.B IPC_STAT
will be set.
.IP
The caller \fImust\fP ensure that a segment is eventually destroyed;
otherwise its pages that were faulted in will remain in memory or swap.
.IP
See also the description of
.I  /proc/sys/kernel/shm_rmid_forced
in
.BR proc (5).
.TP 10
.BR IPC_INFO " (Linux-specific)"
Return information about system-wide shared memory limits and
parameters in the structure pointed to by
.IR buf .
This structure is of type
.I shminfo
(thus, a cast is required),
defined in
.I <sys/shm.h>
if the
.B _GNU_SOURCE
feature test macro is defined:
.IP
.in +4n
.EX
struct shminfo {
    unsigned long shmmax; /* Maximum segment size */
    unsigned long shmmin; /* Minimum segment size;
                             always 1 */
    unsigned long shmmni; /* Maximum number of segments */
    unsigned long shmseg; /* Maximum number of segments
                             that a process can attach;
                             unused within kernel */
    unsigned long shmall; /* Maximum number of pages of
                             shared memory, system-wide */
};
.EE
.in
.IP
The
.IR shmmni ,
.IR shmmax ,
and
.I shmall
settings can be changed via
.I /proc
files of the same name; see
.BR proc (5)
for details.
.TP
.BR SHM_INFO " (Linux-specific)"
Return a
.I shm_info
structure whose fields contain information
about system resources consumed by shared memory.
This structure is defined in
.I <sys/shm.h>
if the
.B _GNU_SOURCE
feature test macro is defined:
.IP
.in +4n
.EX
struct shm_info {
    int           used_ids; /* # of currently existing
                               segments */
    unsigned long shm_tot;  /* Total number of shared
                               memory pages */
    unsigned long shm_rss;  /* # of resident shared
                               memory pages */
    unsigned long shm_swp;  /* # of swapped shared
                               memory pages */
    unsigned long swap_attempts;
                            /* Unused since Linux 2.4 */
    unsigned long swap_successes;
                            /* Unused since Linux 2.4 */
};
.EE
.in
.TP
.BR SHM_STAT " (Linux-specific)"
Return a
.I shmid_ds
structure as for
.BR IPC_STAT .
However, the
.I shmid
argument is not a segment identifier, but instead an index into
the kernel's internal array that maintains information about
all shared memory segments on the system.
.PP
The caller can prevent or allow swapping of a shared
memory segment with the following \fIcmd\fP values:
.TP 10
.BR SHM_LOCK " (Linux-specific)"
Prevent swapping of the shared memory segment.
The caller must fault in
any pages that are required to be present after locking is enabled.
If a segment has been locked, then the (nonstandard)
.B SHM_LOCKED
flag of the
.I shm_perm.mode
field in the associated data structure retrieved by
.B IPC_STAT
will be set.
.TP
.BR SHM_UNLOCK " (Linux-specific)"
Unlock the segment, allowing it to be swapped out.
.PP
In kernels before 2.6.10, only a privileged process
could employ
.B SHM_LOCK
and
.BR SHM_UNLOCK .
Since kernel 2.6.10, an unprivileged process can employ these operations
if its effective UID matches the owner or creator UID of the segment, and
(for
.BR SHM_LOCK )
the amount of memory to be locked falls within the
.B RLIMIT_MEMLOCK
resource limit (see
.BR setrlimit (2)).
.\" There was some weirdness in 2.6.9: SHM_LOCK and SHM_UNLOCK could
.\" be applied to a segment, regardless of ownership of the segment.
.\" This was a botch-up in the move to RLIMIT_MEMLOCK, and was fixed
.\" in 2.6.10.  MTK, May 2005
.SH RETURN VALUE
A successful
.B IPC_INFO
or
.B SHM_INFO
operation returns the index of the highest used entry in the
kernel's internal array recording information about all
shared memory segments.
(This information can be used with repeated
.B SHM_STAT
operations to obtain information about all shared memory segments
on the system.)
A successful
.B SHM_STAT
operation returns the identifier of the shared memory segment
whose index was given in
.IR shmid .
Other operations return 0 on success.
.PP
On error, \-1 is returned, and
.I errno
is set appropriately.
.SH ERRORS
.TP
.B EACCES
\fBIPC_STAT\fP or \fBSHM_STAT\fP is requested and
\fIshm_perm.mode\fP does not allow read access for
.IR shmid ,
and the calling process does not have the
.B CAP_IPC_OWNER
capability in the user namespace that governs its IPC namespace.
.TP
.B EFAULT
The argument
.I cmd
has value
.B IPC_SET
or
.B IPC_STAT
but the address pointed to by
.I buf
isn't accessible.
.TP
.B EIDRM
\fIshmid\fP points to a removed identifier.
.TP
.B EINVAL
\fIshmid\fP is not a valid identifier, or \fIcmd\fP
is not a valid command.
Or: for a
.B SHM_STAT
operation, the index value specified in
.I shmid
referred to an array slot that is currently unused.
.TP
.B ENOMEM
(In kernels since 2.6.9),
.B SHM_LOCK
was specified and the size of the to-be-locked segment would mean
that the total bytes in locked shared memory segments would exceed
the limit for the real user ID of the calling process.
This limit is defined by the
.B RLIMIT_MEMLOCK
soft resource limit (see
.BR setrlimit (2)).
.TP
.B EOVERFLOW
\fBIPC_STAT\fP is attempted, and the GID or UID value
is too large to be stored in the structure pointed to by
.IR buf .
.TP
.B EPERM
\fBIPC_SET\fP or \fBIPC_RMID\fP is attempted, and the
effective user ID of the calling process is not that of the creator
(found in
.IR shm_perm.cuid ),
or the owner
(found in
.IR shm_perm.uid ),
and the process was not privileged (Linux: did not have the
.B CAP_SYS_ADMIN
capability).
.IP
Or (in kernels before 2.6.9),
.B SHM_LOCK
or
.B SHM_UNLOCK
was specified, but the process was not privileged
(Linux: did not have the
.B CAP_IPC_LOCK
capability).
(Since Linux 2.6.9, this error can also occur if the
.B RLIMIT_MEMLOCK
is 0 and the caller is not privileged.)
.SH CONFORMING TO
POSIX.1-2001, POSIX.1-2008, SVr4.
.\" SVr4 documents additional error conditions EINVAL,
.\" ENOENT, ENOSPC, ENOMEM, EEXIST.  Neither SVr4 nor SVID documents
.\" an EIDRM error condition.
.SH NOTES
The inclusion of
.I <sys/types.h>
and
.I <sys/ipc.h>
isn't required on Linux or by any version of POSIX.
However,
some old implementations required the inclusion of these header files,
and the SVID also documented their inclusion.
Applications intended to be portable to such old systems may need
to include these header files.
.\" Like Linux, the FreeBSD man pages still document
.\" the inclusion of these header files.
.PP
The
.BR IPC_INFO ,
.B SHM_STAT
and
.B SHM_INFO
operations are used by the
.BR ipcs (1)
program to provide information on allocated resources.
In the future, these may modified or moved to a
.I /proc
filesystem interface.
.PP
Linux permits a process to attach
.RB ( shmat (2))
a shared memory segment that has already been marked for deletion
using
.IR shmctl(IPC_RMID) .
This feature is not available on other UNIX implementations;
portable applications should avoid relying on it.
.PP
Various fields in a \fIstruct shmid_ds\fP were typed as
.I short
under Linux 2.2
and have become
.I long
under Linux 2.4.
To take advantage of this,
a recompilation under glibc-2.1.91 or later should suffice.
(The kernel distinguishes old and new calls by an
.B IPC_64
flag in
.IR cmd .)
.SH SEE ALSO
.BR mlock (2),
.BR setrlimit (2),
.BR shmget (2),
.BR shmop (2),
.BR capabilities (7),
.BR svipc (7)
