OSDN Git Service

LDP: Update original to LDP v3.79
[linuxjm/LDP_man-pages.git] / original / man2 / shmget.2
index 9e479b6..3c0dfbb 100644 (file)
@@ -1,5 +1,6 @@
 .\" Copyright (c) 1993 Luigi P. Bai (lpb@softint.com) July 28, 1993
 .\"
+.\" %%%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.
@@ -19,6 +20,7 @@
 .\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
 .\"
 .\" Modified Wed Jul 28 10:57:35 1993, Rik Faith <faith@cs.unc.edu>
 .\" Modified Sun Nov 28 16:43:30 1993, Rik Faith <faith@cs.unc.edu>
@@ -33,9 +35,9 @@
 .\"    Language and formatting clean-ups
 .\"    Added notes on /proc files
 .\"
-.TH SHMGET 2 2006-05-02 "Linux" "Linux Programmer's Manual"
+.TH SHMGET 2 2015-01-10 "Linux" "Linux Programmer's Manual"
 .SH NAME
-shmget \- allocates a shared memory segment
+shmget \- allocates a System V shared memory segment
 .SH SYNOPSIS
 .ad l
 .B #include <sys/ipc.h>
@@ -46,7 +48,7 @@ shmget \- allocates a shared memory segment
 .ad b
 .SH DESCRIPTION
 .BR shmget ()
-returns the identifier of the shared memory segment
+returns the identifier of the System\ V shared memory segment
 associated with the value of the argument
 .IR key .
 A new shared memory segment, with size equal to the value of
@@ -92,28 +94,21 @@ The value
 is composed of:
 .TP 12
 .B IPC_CREAT
-to create a new segment.
+Create a new segment.
 If this flag is not used, then
 .BR shmget ()
 will find the segment associated with \fIkey\fP and check to see if
 the user has permission to access the segment.
 .TP
 .B IPC_EXCL
-used with \fBIPC_CREAT\fP to ensure failure if the segment already exists.
-.TP
-.I mode_flags
-(least significant 9 bits)
-specifying the permissions granted to the owner, group, and world.
-These bits have the same format, and the same
-meaning, as the
-.I mode
-argument of
-.BR open (2).
-Presently, the execute permissions are not used by the system.
+This flag is used with
+.B IPC_CREAT
+to ensure that this call creates the segment.
+If the segment already exists, the call fails.
 .TP
 .BR SHM_HUGETLB " (since Linux 2.6)"
 Allocate the segment using "huge pages."
-See the kernel source file
+See the Linux kernel source file
 .I Documentation/vm/hugetlbpage.txt
 for further information.
 .TP
@@ -136,6 +131,16 @@ in
 .\" As at 2.6.17-rc2, this flag has no effect if SHM_HUGETLB was also
 .\" specified.
 .PP
+In addition to the above flags, the least significant 9 bits of
+.I shmflg
+specify the permissions granted to the owner, group, and others.
+These bits have the same format, and the same
+meaning, as the
+.I mode
+argument of
+.BR open (2).
+Presently, execute permissions are not used by the system.
+.PP
 When a new shared memory segment is created,
 its contents are initialized to zero values, and
 its associated data structure,
@@ -165,7 +170,7 @@ is set to the value of
 .IP
 .IR shm_lpid ,
 .IR shm_nattch ,
-.I shm_atime
+.IR shm_atime ,
 and
 .I shm_dtime
 are set to 0.
@@ -175,10 +180,11 @@ is set to the current time.
 .PP
 If the shared memory segment already exists, the permissions are
 verified, and a check is made to see if it is marked for destruction.
-.SH "RETURN VALUE"
-A valid segment identifier,
-.IR shmid ,
-is returned on success, \-1 on error.
+.SH RETURN VALUE
+On success, a valid shared memory identifier is returned.
+On error, \-1 is returned, and
+.I errno
+is set to indicate the error.
 .SH ERRORS
 On failure,
 .I errno
@@ -191,13 +197,26 @@ shared memory segment, and does not have the
 capability.
 .TP
 .B EEXIST
-.B IPC_CREAT | IPC_EXCL
-was specified and the segment exists.
+.BR IPC_CREAT
+and
+.BR IPC_EXCL
+were specified in
+.IR shmflg ,
+but a shared memory segment already exists for
+.IR key .
 .TP
 .B EINVAL
-A new segment was to be created and \fIsize\fP < \fBSHMMIN\fP
-or \fIsize\fP > \fBSHMMAX\fP, or no new segment was to be created,
-a segment with given key existed, but \fIsize\fP is greater than the size
+A new segment was to be created and
+.I size
+is less than
+.B SHMMIN
+or greater than
+.BR SHMMAX .
+.TP
+.B EINVAL
+A segment for the given
+.I key
+exists, but \fIsize\fP is greater than the size
 of that segment.
 .TP
 .B ENFILE
@@ -226,36 +245,107 @@ The
 flag was specified, but the caller was not privileged (did not have the
 .B CAP_IPC_LOCK
 capability).
-.SH "CONFORMING TO"
+.SH CONFORMING TO
 SVr4, POSIX.1-2001.
 .\" SVr4 documents an additional error condition EEXIST.
 
 .B SHM_HUGETLB
-is a nonportable Linux extension.
+and
+.B SHM_NORESERVE
+are Linux extensions.
 .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.
+
 .B IPC_PRIVATE
 isn't a flag field but a
 .I key_t
 type.
 If this special value is used for
 .IR key ,
-the system call ignores everything but the least significant 9 bits of
+the system call ignores all but the least significant 9 bits of
 .I shmflg
-and creates a new shared memory segment (on success).
-.PP
+and creates a new shared memory segment.
+.\"
+.SS Shared memory limits
 The following limits on shared memory segment resources affect the
 .BR shmget ()
 call:
 .TP
 .B SHMALL
-System wide maximum of shared memory pages
-(on Linux, this limit can be read and modified via
-.IR /proc/sys/kernel/shmall ).
+System-wide limit on the total amount of shared memory,
+measured in units of the system page size.
+
+On Linux, this limit can be read and modified via
+.IR /proc/sys/kernel/shmall .
+Since Linux 3.16,
+.\" commit 060028bac94bf60a65415d1d55a359c3a17d5c31
+the default value for this limit is:
+
+    ULONG_MAX - 2^24
+
+The effect of this value
+(which is suitable for both 32-bit and 64-bit systems)
+is to impose no limitation on allocations.
+This value, rather than
+.BR ULONG_MAX ,
+was chosen as the default to prevent some cases where historical
+applications simply raised the existing limit without first checking
+its current value.
+Such applications would cause the value to overflow if the limit was set at
+.BR ULONG_MAX .
+
+From Linux 2.4 up to Linux 3.15,
+the default value for this limit was:
+
+    SHMMAX / PAGE_SIZE * (SHMMNI / 16)
+
+If
+.B SHMMAX
+and
+.B SHMMNI
+were not modified, then multiplying the result of this formula
+by the page size (to get a value in bytes) yielded a value of 8 GB
+as the limit on the total memory used by all shared memory segments.
 .TP
 .B SHMMAX
-Maximum size in bytes for a shared memory segment: policy dependent
-(on Linux, this limit can be read and modified via
-.IR /proc/sys/kernel/shmmax ).
+Maximum size in bytes for a shared memory segment.
+
+On Linux, this limit can be read and modified via
+.IR /proc/sys/kernel/shmmax .
+Since Linux 3.16,
+.\" commit 060028bac94bf60a65415d1d55a359c3a17d5c31
+the default value for this limit is:
+
+    ULONG_MAX - 2^24
+
+The effect of this value
+(which is suitable for both 32-bit and 64-bit systems)
+is to impose no limitation on allocations.
+See the description of
+.BR SHMALL
+for a discussion of why this default value (rather than
+.BR ULONG_MAX )
+is used.
+
+From Linux 2.2 up to Linux 3.15, the default value of
+this limit was 0x2000000 (32MB).
+
+Because it is not possible to map just part of a shared memory segment,
+the amount of virtual memory places another limit on the maximum size of a
+usable segment:
+for example, on i386 the largest segments that can be mapped have a
+size of around 2.8 GB, and on x86_64 the limit is around 127 TB.
 .TP
 .B SHMMIN
 Minimum size in bytes for a shared memory segment: implementation
@@ -264,10 +354,12 @@ dependent (currently 1 byte, though
 is the effective minimum size).
 .TP
 .B SHMMNI
-System wide maximum number of shared memory segments: implementation
-dependent (currently 4096, was 128 before Linux 2.3.99;
-on Linux, this limit can be read and modified via
-.IR /proc/sys/kernel/shmmni ).
+System-wide limit on the number of shared memory segments.
+In Linux 2.2, the default value for this limit was 128;
+since Linux 2.4, the default value is 4096.
+
+On Linux, this limit can be read and modified via
+.IR /proc/sys/kernel/shmmni .
 .\" Kernels between 2.4.x and 2.6.8 had an off-by-one error that meant
 .\" that we could create one more segment than SHMMNI -- MTK
 .\" This /proc file is not available in Linux 2.2 and earlier -- MTK
@@ -275,8 +367,8 @@ on Linux, this limit can be read and modified via
 The implementation has no specific limits for the per-process maximum
 number of shared memory segments
 .RB ( SHMSEG ).
-.SS Linux Notes
-Until version 2.3.30 Linux would return
+.SS Linux notes
+Until version 2.3.30, Linux would return
 .B EIDRM
 for a
 .BR shmget ()
@@ -287,7 +379,8 @@ The name choice
 was perhaps unfortunate,
 .B IPC_NEW
 would more clearly show its function.
-.SH "SEE ALSO"
+.SH SEE ALSO
+.BR memfd_create (2),
 .BR shmat (2),
 .BR shmctl (2),
 .BR shmdt (2),
@@ -295,3 +388,12 @@ would more clearly show its function.
 .BR capabilities (7),
 .BR shm_overview (7),
 .BR svipc (7)
+.SH COLOPHON
+This page is part of release 3.79 of the Linux
+.I man-pages
+project.
+A description of the project,
+information about reporting bugs,
+and the latest version of this page,
+can be found at
+\%http://www.kernel.org/doc/man\-pages/.