Listing 1

/* semaphore.h */

#ifndef SEMAPHOR_H /* prevent multiple includes */
#define SEMAPHOR_H

#include <limits.h>
#ifndef PATH_MAX
#define PATH_MAX    (256)      /* max # of characters in a path name */
#endif

/* constants */
#define SEMOPEN_MAX (60)       /* max # semaphore sets open at once */

/* type definitions */
typedef struct {            /* semaphore set control structure */
    char semdir[PATH_MAX + 1];  /* semaphore directory path name */
    int semc;           /* semaphore count */
} semset_t;

/* function declarations */
int     semclose(semset_t *ssp);
#define     semcount(ssp) ((ssp)->semc)
int     semlower(semset_t *ssp, int semno);
semset_t * semopen(char *semdir, int flags, int semc);
int     semraise(semset_t *ssp, int semno);
int     semremove(char *semdir);

/* semopen command flags */
#define SEM_CREAT   (01000)     /* create and open */
#define SEM_EXCL    (02000)     /* exclusive open */

/* error codes */
#define SEMEOS      (0)     /* start of error code domain */
#define SEMEMFILE   (SEMEOS - 1)   /* too many semaphore sets open */
#define SEMPANIC    (SEMEOS - 2)   /* internal semaphore error */

#endif  /* #ifndef SEMAPHOR_H */