January 21, 2005 SEM_OPEN 3

### NAME

sem_open, sem_close, sem_unlink - named semaphore operations

### LIBRARY

POSIX Real-time Library (librt, -lrt)

### SYNOPSIS

```sem_t *` sem_open(```const char *name``, int oflag``, ...`)
```int` sem_close(```sem_t *sem`)
```int` sem_unlink(```const char *name`)

### DESCRIPTION

The sem_open(``) function creates or opens the named semaphore specified by ```name`. The returned semaphore may be used in subsequent calls to sem_getvalue(3), sem_wait(3), sem_trywait(3), sem_post(3), and sem_close(``).

The following bits may be set in the ```oflag` argument:

```O_CREAT`
  Create the semaphore if it does not already exist.

  The third argument to the call to sem_open(``) must be of type and specifies the mode for the semaphore. Only the ```S_IWUSR`,`S_IWGRP`, and ```S_IWOTH` bits are examined; it is not possible to grant only ``read'' permission on a semaphore. The mode is modified according to the process's file creation mask; see umask(2).

  The fourth argument must be an and specifies the initial value for the semaphore, and must be no greater than ```SEM_VALUE_MAX`.

```O_EXCL`
  Create the semaphore if it does not exist. If the semaphore already exists, sem_open(``) will fail. This flag is ignored unless ```O_CREAT` is also specified.

The sem_close(``) function closes a named semaphore that was opened by a call to sem_open(``).

The sem_unlink(``) function removes the semaphore named ```name`. Resources allocated to the semaphore are only deallocated when all processes that have the semaphore open close it.

### RETURN VALUES

If successful, the sem_open(``) function returns the address of the opened semaphore. If the same ```name` argument is given to multiple calls to sem_open(``) by the same process without an intervening call to sem_close(``), the same address is returned each time. If the semaphore cannot be opened, sem_open(``) returns ```SEM_FAILED` and the global variable errno is set to indicate the error.

### ERRORS

The sem_open(``) function will fail if:

[```EACCES`]
  The semaphore exists and the permissions specified by ```oflag` at the time it was created deny access to this process.

[```EACCES`]
  The semaphore does not exist, but permission to create it is denied.

[```EEXIST`]
  ```O_CREAT` and ```O_EXCL` are set but the semaphore already exists.

[```EINTR`]
  The call was interrupted by a signal.

[```EINVAL`]
  The sem_open(``) operation is not supported for the given ```name`.

[```EINVAL`]
  The ```value` argument is greater than ```SEM_VALUE_MAX`.

[```ENAMETOOLONG`]
  The ```name` argument is too long.

[```ENFILE`]
  The system limit on semaphores has been reached.

[```ENOENT`]
  ```O_CREAT` is not set and the named semaphore does not exist.

[```ENOSPC`]
  There is not enough space to create the semaphore.

The sem_close(``) function will fail if:

[```EINVAL`]
  The ```sem` argument is not a valid semaphore.

The sem_unlink(``) function will fail if:

[```EACCES`]
  Permission is denied to unlink the semaphore.

[```ENAMETOOLONG`]
  The specified ```name` is too long.

[```ENOENT`]
  The named semaphore does not exist.

### SEE ALSO

close(2), open(2), umask(2), unlink(2), sem_getvalue(3), sem_post(3), sem_trywait(3), sem_wait(3), sem(4)

### STANDARDS

The sem_open(``), sem_close(``), and sem_unlink(``) functions conform to ISO/IEC 9945-1:1996 (``POSIX.1'') .

### HISTORY

Support for named semaphores first appeared in NetBSD2.0.

### BUGS

This implementation places strict requirements on the value of ```name`: it must begin with a slash (`/'), contain no other slash characters, and be less than 14 characters in length not including the terminating null character.