'\"macro stdmacro
.if n .pH g2.shmctl @(#)shmctl	40.16 of 10/10/89
.\" Copyright 1989 AT&T
.nr X
.if \nX=0 .ds x} shmctl 2 "" "\&"
.if \nX=1 .ds x} shmctl 2 ""
.if \nX=2 .ds x} shmctl 2 "" "\&"
.if \nX=3 .ds x} shmctl "" "" "\&"
.TH \*(x}
.SH NAME
\f4shmctl\f1 \- shared memory control operations
.SH SYNOPSIS
\f4#include <sys/types.h>\f1
.br
\f4#include <sys/ipc.h>\f1
.br
\f4#include <sys/shm.h>\f1
.PP
\f4int shmctl (int shmid, int cmd, struct shmid_ds *buf); \f1
.SH DESCRIPTION
\f4shmctl\fP
provides a variety of shared memory control operations as specified by
.IR cmd .
The following
.IR cmd s
are available:
.TP \w'SHM_UNLOCK\ \ 'u
\f4IPC_STAT\f1
Place the current value of each member of the data structure associated with
.I shmid
into the structure pointed to by
.IR buf .
The contents of this structure are defined in
\f4intro\fP(2).
.SM {READ}
.TP
\f4IPC_SET\f1
Set the value of the following members of the data structure associated with
.I shmid
to the corresponding value found in the structure pointed to by
.IR buf :
.nf
.IP "" \w'SHM_UNLOCK\ \ \ \ \ \ 'u
.ft 4
shm_perm.uid
shm_perm.gid
shm_perm.mode /\(** only access permission bits \(**/
.ft 1
.fi
.IP "" \w'SHM_UNLOCK\ \ 'u
This command can be executed only by a process that has an effective user
.SM ID
equal to that of super-user, or to the value of
\f4shm_perm.cuid\f1
or 
\f4shm_perm.uid\f1
in the data structure associated with
.IR shmid .
.TP
\f4IPC_RMID\f1
Remove the shared memory identifier specified by
.I shmid
from the system and destroy the shared memory segment and data structure
associated with it.
This command can be executed only by a process that has an effective user
.SM ID
equal to that of super-user, or to the value of
\f4shm_perm.cuid\f1
or
\f4shm_perm.uid\f1
in the data structure associated with
.IR shmid .
.TP
\f4SHM_LOCK\f1
Lock the shared memory segment specified by \f2shmid\fP in memory.
This command can be executed only by a process that has an effective user
.SM ID
equal to super-user.
.TP
\f4SHM_UNLOCK\f1
Unlock the shared memory segment specified by \f2shmid\fP.
This command can be executed only by a process that has an effective user
.SM ID
equal to super-user.
.PP
\f4shmctl\fP
fails if one or more of the following are true:
.TP 12
\f4EACCES\fP
.I cmd
is equal to \f4IPC_STAT\f1 and
.SM {READ}
operation permission is denied to the calling process [see
\f4intro\fP(2)].
.TP 12
\f4EINVAL\fP
.I shmid
is not a valid shared memory identifier.
.TP
\f4EINVAL\fP
.I cmd
is not a valid command.
.TP
\f4EINVAL\fP
\f2cmd\f1 is \f4IPC_SET\fP and \f4shm_perm.uid\fP or \f4shm_perm.gid\fP
is not valid.
.TP
\f4EOVERFLOW\fP
\f2cmd\f1 is \f4IPC_STAT\fP and \f2uid\f1 or \f2gid\f1 is too large
to be stored in the structure pointed to by \f2buf\f1.
.TP
\f4EPERM\fP
.I cmd
is equal to
\f4IPC_RMID\f1
or
\f4IPC_SET\f1
and the effective user
.SM ID
of the calling process is not equal to that of super-user, or 
to the value of
\f4shm_perm.cuid\f1
or
\f4shm_perm.uid\f1
in the data structure associated with
.IR shmid .
.TP
\f4EPERM\fP
.I cmd
is equal to
\f4SHM_LOCK\f1
or
\f4SHM_UNLOCK\f1
and the effective user
.SM ID
of the calling process is not equal to that of super-user.
.TP
\f4EFAULT\fP
.I buf
points to an illegal address.
.TP
\f4ENOMEM\fP
.I cmd
is equal to
\f4SHM_LOCK\f1
and there is not enough memory.
.SH SEE ALSO
\f4shmget\fP(2), \f4shmop\fP(2).
.SH "DIAGNOSTICS"
Upon successful completion, a value of 0 is returned. Otherwise, a
value of \-1 is returned and
\f4errno\fP
is set to indicate the error.
.SH NOTES
The user must explicitly remove shared memory segments
after the last reference to them has been removed.
.\"	@(#)shmctl.2	5.2 of 5/18/82 + paging changes
.Ee
