COHERENT manpages
This page displays the COHERENT manpage for semget() [Create or get a set of semaphores].
List of available manpages
Index
semget() -- General Function (libc) Create or get a set of semaphores #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> semget(semkey, number, flag) key_t semkey; int number, flag; semget() creates a set of semaphores plus its associated data structure and identifier, links them to the identifier semkey, and returns the identifier that it has associated with semkey. semkey is an identifier that your application generates to identify its semaphores. number gives the of semaphores you want shmget() to create. flag can be bitwise OR'd to include the following constants: IPC_ALLOC This process already has a set of semaphores; please fetch it. IPC_CREAT If this process does not have a set of semaphores, please create one. IPC_EXCL Fail if this process already has a set of semaphores. IPC_NOWAIT Fail if the process must wait to obtain a set of semaphores. When it creates a set of semaphores, semget() also creates a copy of structure semid_ds, which the header file <sys/sem.h> defines as follows: struct semid_ds { struct ipc_perm sem_perm;/* operation permission struct */ struct sem *sem_base; /* pointer to first semaphore in set */ unsigned short sem_nsems;/* # of semaphores in set */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ }; Field sem_base points the semaphores themselves. Each semaphore is a structure of type sem, which header file <sys/sem.h> defines as follows: struct sem { unsigned short semval; /* semaphore text map address */ short sempid; /* pid of last operation */ unsigned short semncnt;/* # awaiting semval > cval */ unsigned short semzcnt;/* # awaiting semval = 0 */ }; Field sem_perm is a structure of type ipc_perm, which header file <sys/ipc.h> defines as follows: struct ipc_perm { unsigned short uid; /* owner's user id */ unsigned short gid; /* owner's group id */ unsigned short cuid; /* creator's user id */ unsigned short cgid; /* creator's group id */ unsigned short mode; /* access modes */ unsigned short seq; /* slot usage sequence number */ key_t key; /* key */ }; semget() initializes semid_ds as follows: -> It sets the fields sem_perm.cuid, sem_perm.uid, sem_perm.cgid, and sem_perm.gid to, respectively, the effective user and group identifiers of the calling process. -> It sets the low-order nine bits of sem_perm.mode to the low-order nine bits of flag. These nine bits define access permissions: the top three bits give the owner's access permissions (read, write, execute), the middle three bits the owning group's access permissions, and the low three bits access permissions for others. -> It sets sem_nsems to number. This gives the number of semaphores to which sem_base points. -> It sets field sem_otime to zero, and field sem_ctime to the current time. semget() fails if any of the following are true: -> number is less than one and the set of semaphores identified by semkey does not exist. semget() sets errno to EINVAL. -> number exceeds the system-imposed limit (EINVAL). -> A semaphore identifier exists for semkey, but permission, as specified flag's low-order nine bits, is not granted (EACCES). -> A semaphore identifier exists for semkey, but the number of semaphores in its set is less than number, and number does not equal zero (EINVAL). -> A semaphore identifier does not exist for semkey and (flag & IPC_CREAT) is false (ENOENT). -> semget() tried to create a set of semaphores, but could not because the maximum number of sets allowable by the system always exists (ENOSPC). -> A semaphore identifier already exists for semkey but flag requests that semget() create an exclusive set for it -- i.e. ( (flag & IPC_CREAT) && (flag & IPC_EXCL) ) is true (EEXIST). If all goes well, semget() returns a semaphore identifier, which is always a non-negative integer. Otherwise, it returns -1 and sets errno to an appropriate value. Files /usr/include/sys/ipc.h /usr/include/sys/sem.h See Also ftok(), ipcrm, ipcs, libc, libsocket, semctl(), semop() Notes Prior to release 4.2, COHERENT implemented semaphores through the driver sem. In release 4.2, and subsequent releases, COHERENT has implemented semaphores as a set of functions that conform in large part to the UNIX System-V standard. The kernel variables SEMMNI and SHMMNS set, respectively, the maximum number of identifiers that can exist at any given time and the maximum number of semaphores that a set can hold. Daredevil system operators who have large amounts of memory at their disposal may wish to change these variables to increase the system-defined limits. For details on how to do so, see the Lexicon entry mtune.