Manpage of SEMGET

SEMGET

Section: Linux Programmer's Manual (2)
Updated: 2016-10-08
Index
 

NAME

semget - get a System V semaphore set identifier  

SYNOPSIS

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>

int semget(key_t key,int nsems,int semflg); 

DESCRIPTION

The semget() system call returns the System V semaphore set identifier associated with the argument key. A new set of nsemssemaphores is created if keyhas the value IPC_PRIVATEor if no existing semaphore set is associated with keyand IPC_CREATis specified in semflg.

If semflgspecifies both IPC_CREATand IPC_EXCLand a semaphore set already exists for key, then semget() fails with errnoset to EEXIST. (This is analogous to the effect of the combination O_CREAT | O_EXCLfor open(2).)

Upon creation, the least significant 9 bits of the argument semflgdefine the permissions (for owner, group and others) for the semaphore set. These bits have the same format, and the same meaning, as the modeargument of open(2) (though the execute permissions are not meaningful for semaphores, and write permissions mean permission to alter semaphore values).

When creating a new semaphore set, semget() initializes the set's associated data structure, semid_ds(see semctl(2)), as follows:

sem_perm.cuidand sem_perm.uidare set to the effective user ID of the calling process.
sem_perm.cgidand sem_perm.gidare set to the effective group ID of the calling process.
The least significant 9 bits of sem_perm.modeare set to the least significant 9 bits of semflg.
sem_nsemsis set to the value of nsems.
sem_otimeis set to 0.
sem_ctimeis set to the current time.

The argument nsemscan be 0 (a don't care) when a semaphore set is not being created. Otherwise, nsemsmust be greater than 0 and less than or equal to the maximum number of semaphores per semaphore set (SEMMSL).

If the semaphore set already exists, the permissions are verified.  

RETURN VALUE

If successful, the return value will be the semaphore set identifier (a nonnegative integer), otherwise, -1 is returned, with errnoindicating the error.  

ERRORS

On failure, errnowill be set to one of the following:
EACCES
A semaphore set exists for key, but the calling process does not have permission to access the set, and does not have the CAP_IPC_OWNERcapability in the user namespace that governs its IPC namespace.
EEXIST
IPC_CREATand IPC_EXCLwere specified in semflg, but a semaphore set already exists for key.
EINVAL
nsemsis less than 0 or greater than the limit on the number of semaphores per semaphore set (SEMMSL).
EINVAL
A semaphore set corresponding to keyalready exists, but nsemsis larger than the number of semaphores in that set.
ENOENT
No semaphore set exists for keyand semflgdid not specify IPC_CREAT.
ENOMEM
A semaphore set has to be created but the system does not have enough memory for the new data structure.
ENOSPC
A semaphore set has to be created but the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded.
 

CONFORMING TO

SVr4, POSIX.1-2001.  

NOTES

The inclusion of <sys/types.h>and <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.

IPC_PRIVATEisn't a flag field but a key_ttype. If this special value is used for key, the system call ignores all but the least significant 9 bits of semflgand creates a new semaphore set (on success).  

Semaphore initialization

The values of the semaphores in a newly created set are indeterminate. (POSIX.1-2001 and POSIX.1-2008 are explicit on this point, although POSIX.1-2008 notes that a future version of the standard may require an implementation to initialize the semaphores to 0.) Although Linux, like many other implementations, initializes the semaphore values to 0, a portable application cannot rely on this: it should explicitly initialize the semaphores to the desired values.

Initialization can be done using semctl(2) SETVALor SETALLoperation. Where multiple peers do not know who will be the first to initialize the set, checking for a nonzero sem_otimein the associated data structure retrieved by a semctl(2) IPC_STAToperation can be used to avoid races.  

Semaphore limits

The following limits on semaphore set resources affect the semget() call:
SEMMNI
System-wide limit on the number of semaphore sets. On Linux systems before version 3.19, the default value for this limit was 128. Since Linux 3.19, the default value is 32,000. On Linux, this limit can be read and modified via the fourth field of /proc/sys/kernel/sem.
SEMMSL
Maximum number of semaphores per semaphore ID. On Linux systems before version 3.19, the default value for this limit was 250. Since Linux 3.19, the default value is 32,000. On Linux, this limit can be read and modified via the first field of /proc/sys/kernel/sem.
SEMMNS
System-wide limit on the number of semaphores: policy dependent (on Linux, this limit can be read and modified via the second field of /proc/sys/kernel/sem). Note that the number of semaphores system-wide is also limited by the product of SEMMSLand SEMMNI.
 

BUGS

The name choice IPC_PRIVATEwas perhaps unfortunate, IPC_NEWwould more clearly show its function.  

SEE ALSO

semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUE
ERRORS
CONFORMING TO
NOTES
Semaphore initialization
Semaphore limits
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 16:30:08 GMT, October 09, 2016 Click Here!