Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ semop(2) — UnixWare 2.01

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exec(2)

exit(2)

fork(2)

intro(2)

semctl(2)

semget(2)






       semop(2)                                                    semop(2)


       NAME
             semop - semaphore operations

       SYNOPSIS
             #include <sys/types.h>
             #include <sys/ipc.h>
             #include <sys/sem.h>
             int semop(int semid, struct sembuf *sops, size_t nsops);

       DESCRIPTION
             semop is used to perform atomically an array of semaphore
             operations on the set of semaphores associated with the
             semaphore identifier specified 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 corresponding semaphore specified by semid and sem_num.

             sem_op specifies one of three semaphore operations as follows,
             depending on whether its value is negative, positive, or zero:

             If sem_op is a negative integer, one of the following occurs:
             {ALTER}

                   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(2)] for the
                   specified semaphore.

                   If semval is less than the absolute value of sem_op and
                   (sem_flg&IPC_NOWAIT) is true, semop returns immediately.

                   If semval is less than the absolute value of sem_op and
                   (sem_flg&IPC_NOWAIT) is false, semop increments the
                   semncnt associated with the specified semaphore and
                   suspends execution of the calling process until one of
                   the following conditions occur.



                           Copyright 1994 Novell, Inc.               Page 1













      semop(2)                                                    semop(2)


                        semval becomes greater than or equal to the
                        absolute value of sem_op.  When this occurs, the
                        value of semncnt associated with the specified
                        semaphore 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
                        decremented, and the calling process resumes
                        execution in the manner prescribed in signal(5).

            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 occurs: {READ}

                  If semval is zero, semop returns immediately.

                  If semval is not equal to zero and (sem_flg&IPC_NOWAIT)
                  is true, semop returns immediately.

                  If semval is not equal to zero and (sem_flg&IPC_NOWAIT)
                  is false, semop increments the semzcnt associated with
                  the specified semaphore and suspends execution of the
                  calling process until one of the following occurs:

                        semval becomes zero, at which time the value of
                        semzcnt associated with the specified semaphore is
                        decremented.

                        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.



                          Copyright 1994 Novell, Inc.               Page 2













       semop(2)                                                    semop(2)


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

          Return Values
             On success, semop returns 0, and 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.

             On failure, semop returns -1 and sets errno to identify the
             error.

          Errors
             In the following conditions, semop fails and sets errno to:

             EINTR          semop returned due to receipt of a signal.

             EIDRM          semop returned due to the removal of semid from
                            the system.

             EFBIG          sem_num is less than zero or greater than or
                            equal to the number of semaphores in the set
                            associated with semid.  In this instance, the
                            signal SIGXFSZ will not be generated.  However,
                            if file sizes are too big, the signal SIGXFSZ
                            will be generated.

             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.

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

             EINVAL         semid is not a valid semaphore identifier.





                           Copyright 1994 Novell, Inc.               Page 3













      semop(2)                                                    semop(2)


            EINVAL         The number of individual semaphores for which
                           the calling process requests a SEM_UNDO would
                           exceed the limit.

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

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

            EFAULT         sops points to an illegal address.

      REFERENCES
            exec(2), exit(2), fork(2), intro(2), semctl(2), semget(2)

      NOTICES
         Considerations for Threads Programming
            While one thread is blocked, siblings might still be
            executing.

            The Threads Library provides another semaphore facility for
            the synchronization of multithreaded programs.  See
            semaphore(3synch).  That facility can also be used for
            synchronization between processes.  See discussion of the
            USYNC_PROCESS flag.























                          Copyright 1994 Novell, Inc.               Page 4








Typewritten Software • bear@typewritten.org • Edmonds, WA 98026