unixdev.net


Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (SunOS-4.1.3)
Page:
Section:
Apropos / Subsearch:
optional field

SEMOP(2)                      System Calls Manual                     SEMOP(2)



NAME
       semop - semaphore operations

SYNOPSIS
       #include <&lt;sys/types.h>&gt;
       #include <&lt;sys/ipc.h>&gt;
       #include <&lt;sys/sem.h>&gt;

       int semop(semid, sops, nsops)
       int semid;
       struct sembuf *sops;
       int nsops;

DESCRIPTION
       semop()  is used to perform atomically an array of semaphore operations
       on the set of semaphores associated with the semaphore identifier spec-
       ified  by semid.  sops is a pointer to the array of semaphore-operation
       structures.  nsops is the number of such structures in the array.   The
       contents of each structure includes the following members:

              short   sem_num;    /* semaphore number */
              short   sem_op;     /* semaphore operation */
              short   sem_flg;    /* operation flags */

       Each semaphore operation specified by sem_op is performed on the corre-
       sponding semaphore specified by semid and sem_num.

       sem_op specifies one of three semaphore operations as follows:

               If sem_op is a negative integer,  one  of  the  following  will
               occur: [ALTER] (see semctl(2))

               o  If  semval  (see  intro(2))  is greater than or equal to the
                  absolute value of sem_op(), the absolute value  of  sem_op()
                  is subtracted from semval.  Also, if (sem_flg & SEM_UNDO) is
                  ``true'', the absolute value of sem_op()  is  added  to  the
                  calling process's semadj value (see exit(2V)) for the speci-
                  fied semaphore.

               o  If semval is less than the absolute value  of  sem_op()  and
                  (sem_flg  &  IPC_NOWAIT)  is  ``true'',  semop() will return
                  immediately.

               o  If semval is less than the absolute value  of  sem_op()  and
                  (sem_flg  & IPC_NOWAIT) is ``false'', semop() will increment
                  the semncnt associated with the specified semaphore and sus-
                  pend  execution of the calling process until one of the fol-
                  lowing conditions occur.

                           semval becomes greater than or equal to  the  abso-
                           lute  value  of  sem_op().   When  this occurs, the
                           value of semncnt associated with the specified sem-
                           aphore   is  decremented,  the  absolute  value  of
                           sem_op() is subtracted from semval and, if (sem_flg
                           &  SEM_UNDO)  is  ``true'',  the  absolute value of
                           sem_op() is added to the calling  process's  semadj
                           value for the specified semaphore.

                           The semid for which the calling process is awaiting
                           action is removed from the system (see  semctl(2)).
                           When  this occurs, errno is set equal to EIDRM, and
                           a value of -1 is returned.

                           The calling process receives a signal that is to be
                           caught.   When  this  occurs,  the value of semncnt
                           associated with the specified semaphore  is  decre-
                           mented,  and  the calling process resumes execution
                           in the manner prescribed in signal(3V).

               If sem_op() is a positive integer, the  value  of  sem_op()  is
               added  to  semval and, if (sem_flg & SEM_UNDO) is ``true'', the
               value of sem_op() is  subtracted  from  the  calling  process's
               semadj value for the specified semaphore.  [ALTER]

               If sem_op() is zero, one of the following will occur: [READ]

               o  If semval is zero, semop() will return immediately.

               o  If semval is not equal to zero and (sem_flg & IPC_NOWAIT) is
                  ``true'', semop() will return immediately.

               o  If semval is not equal to zero and (sem_flg & IPC_NOWAIT) is
                  ``false'',  semop()  will  increment  the semzcnt associated
                  with the specified semaphore and suspend  execution  of  the
                  calling process until one of the following occurs:

                              o  semval  becomes zero, at which time the value
                                 of semzcnt associated with the specified sem-
                                 aphore is decremented.

                              o  The  semid  for  which the calling process is
                                 awaiting action is removed from  the  system.
                                 When  this  occurs,  errno  is  set  equal to
                                 EIDRM, and a value of -1 is returned.

                              o  The calling process receives a signal that is
                                 to be caught.  When this occurs, the value of
                                 semzcnt associated with the  specified  sema-
                                 phore is decremented, and the calling process
                                 resumes execution in the manner prescribed in
                                 signal(3V).

       Upon  successful  completion,  the  value  of sempid for each semaphore
       specified in the array pointed to by sops is set equal to  the  process
       ID of the calling process.

RETURN VALUES
       semop() returns:

       0      on success.

       -1     on failure and sets errno to indicate the error.

ERRORS
       E2BIG          nsops is greater than the system-imposed maximum.

       EACCES         Operation  permission  is  denied to the calling process
                      (see intro(2)).

       EAGAIN         The operation would result in suspension of the  calling
                      process but (sem_flg & IPC_NOWAIT) is ``true''.

       EFAULT         sops points to an illegal address.

       EFBIG          sem_num  is  less  than zero or greater than or equal to
                      the number of semaphores  in  the  set  associated  with
                      semid.

       EIDRM          The  set  of semaphores referred to by msqid was removed
                      from the system.

       EINTR          The call was interrupted by the delivery of a signal.

       EINVAL         semid is not a valid semaphore identifier.

                      The number of individual semaphores for which the  call-
                      ing process requests a SEM_UNDO would exceed the limit.

       ENOSPC         The   limit  on  the  number  of  individual   processes
                      requesting an SEM_UNDO would be exceeded.

       ERANGE         An operation would cause a semval  or  semadj  value  to
                      overflow the system-imposed limit.

SEE ALSO
       ipcrm(1), ipcs(1), intro(2), execve(2V), exit(2V), fork(2V), semctl(2),
       semget(2), signal(3V)



                                21 January 1990                       SEMOP(2)