Man Linux: Main Page and Category List

NAME

       semget - get set of XSI semaphores

SYNOPSIS

       #include <sys/sem.h>

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

DESCRIPTION

       The  semget()  function  operates  on  XSI  semaphores  (see  the  Base
       Definitions volume of IEEE Std 1003.1-2001, Section  4.15,  Semaphore).
       It is unspecified whether this function interoperates with the realtime
       interprocess communication facilities defined in Realtime .

       The semget() function shall return the semaphore identifier  associated
       with key.

       A  semaphore identifier with its associated semid_ds data structure and
       its associated set of nsems semaphores (see <sys/sem.h>) is created for
       key if one of the following is true:

        * The argument key is equal to IPC_PRIVATE.

        * The  argument  key  does  not  already  have  a semaphore identifier
          associated with it and (semflg &IPC_CREAT) is non-zero.

       Upon creation, the semid_ds data  structure  associated  with  the  new
       semaphore identifier is initialized as follows:

        * In  the operation permissions structure sem_perm.cuid, sem_perm.uid,
          sem_perm.cgid, and sem_perm.gid shall be set equal to the  effective
          user  ID  and  effective  group  ID,  respectively,  of  the calling
          process.

        * The low-order 9 bits of sem_perm.mode shall be set equal to the low-
          order 9 bits of semflg.

        * The variable sem_nsems shall be set equal to the value of nsems.

        * The  variable  sem_otime shall be set equal to 0 and sem_ctime shall
          be set equal to the current time.

        * The data structure associated with each semaphore in the  set  shall
          not be initialized. The semctl() function with the command SETVAL or
          SETALL can be used to initialize each semaphore.

RETURN VALUE

       Upon  successful  completion,  semget()  shall  return  a  non-negative
       integer,  namely  a semaphore identifier; otherwise, it shall return -1
       and set errno to indicate the error.

ERRORS

       The semget() function shall fail if:

       EACCES A semaphore identifier exists for key, but operation  permission
              as  specified  by  the  low-order  9 bits of semflg would not be
              granted; see XSI Interprocess Communication .

       EEXIST A semaphore identifier exists for the argument key but  ((semflg
              &IPC_CREAT) &&(semflg &IPC_EXCL)) is non-zero.

       EINVAL The  value of nsems is either less than or equal to 0 or greater
              than the system-imposed limit, or a semaphore identifier  exists
              for  the  argument  key, but the number of semaphores in the set
              associated with it is less than nsems and nsems is not equal  to
              0.

       ENOENT A  semaphore  identifier does not exist for the argument key and
              (semflg &IPC_CREAT) is equal to 0.

       ENOSPC A semaphore identifier is to be created but  the  system-imposed
              limit  on  the  maximum number of allowed semaphores system-wide
              would be exceeded.

       The following sections are informative.

EXAMPLES

   Creating a Semaphore Identifier
       The following example gets a unique  semaphore  key  using  the  ftok()
       function,  then  gets a semaphore ID associated with that key using the
       semget() function (the first call also tests to make sure the semaphore
       exists).  If  the  semaphore does not exist, the program creates it, as
       shown by the second call to semget(). In creating the semaphore for the
       queuing  process,  the  program  attempts  to create one semaphore with
       read/write permission for all. It also uses the  IPC_EXCL  flag,  which
       forces semget() to fail if the semaphore already exists.

       After  creating  the  semaphore,  the program uses a call to semop() to
       initialize it to the values in the sbuf array. The number of  processes
       that  can  execute  concurrently without queuing is initially set to 2.
       The final call to semget() creates a semaphore identifier that  can  be
       used later in the program.

              #include <sys/types.h>
              #include <stdio.h>
              #include <sys/ipc.h>
              #include <sys/sem.h>
              #include <sys/stat.h>
              #include <errno.h>
              #include <unistd.h>
              #include <stdlib.h>
              #include <pwd.h>
              #include <fcntl.h>
              #include <limits.h>
              ...
              key_t semkey;
              int semid, pfd, fv;
              struct sembuf sbuf;
              char *lgn;
              char filename[PATH_MAX+1];
              struct stat outstat;
              struct passwd *pw;
              ...
              /* Get unique key for semaphore. */
              if ((semkey = ftok("/tmp",a)) == (key_t) -1) {
                  perror("IPC error: ftok"); exit(1);
              }

              /* Get semaphore ID associated with this key. */
              if ((semid = semget(semkey, 0, 0)) == -1) {

                  /* Semaphore does not exist - Create. */
                  if ((semid = semget(semkey, 1, IPC_CREAT | IPC_EXCL | S_IRUSR |
                      S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) != -1)
                  {
                      /* Initialize the semaphore. */
                      sbuf.sem_num = 0;
                      sbuf.sem_op = 2;  /* This is the number of runs
                                           without queuing. */
                      sbuf.sem_flg = 0;
                      if (semop(semid, &sbuf, 1) == -1) {
                          perror("IPC error: semop"); exit(1);
                      }
                  }
                  else if (errno == EEXIST) {
                      if ((semid = semget(semkey, 0, 0)) == -1) {
                          perror("IPC error 1: semget"); exit(1);
                      }
                  }
                  else {
                      perror("IPC error 2: semget"); exit(1);
                  }
              }
              ...

APPLICATION USAGE

       The   POSIX  Realtime  Extension  defines  alternative  interfaces  for
       interprocess communication. Application developers who need to use  IPC
       should design their applications so that modules using the IPC routines
       described in XSI Interprocess Communication can be easily  modified  to
       use the alternative interfaces.

RATIONALE

       None.

FUTURE DIRECTIONS

       None.

SEE ALSO

       XSI  Interprocess  Communication  ,  Realtime  ,  semctl()  , semop() ,
       sem_close() , sem_destroy() , sem_getvalue() , sem_init() ,  sem_open()
       ,  sem_post() , sem_unlink() , sem_wait() , the Base Definitions volume
       of IEEE Std 1003.1-2001, <sys/sem.h>

COPYRIGHT

       Portions of this text are reprinted and reproduced in  electronic  form
       from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
       -- Portable Operating System Interface (POSIX),  The  Open  Group  Base
       Specifications  Issue  6,  Copyright  (C) 2001-2003 by the Institute of
       Electrical and Electronics Engineers, Inc and The Open  Group.  In  the
       event of any discrepancy between this version and the original IEEE and
       The Open Group Standard, the original IEEE and The Open Group  Standard
       is  the  referee document. The original Standard can be obtained online
       at http://www.opengroup.org/unix/online.html .