---
name: "sem_init"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/sem_init"
---

# sem\_init(3)

initialize an unnamed semaphore

## NAME

sem\_init - initialize an unnamed semaphore

## LIBRARY

POSIX threads library (*libpthread*, *-lpthread*)

## SYNOPSIS

```
#include <semaphore.h>
```

**int sem\_init(sem\_t \****sem***, int** *pshared***, unsigned int** *value***);**

## DESCRIPTION

**sem\_init**() initializes the unnamed semaphore at the address pointed to by *sem*. The *value* argument specifies the initial value for the semaphore.

The *pshared* argument indicates whether this semaphore is to be shared between the threads of a process, or between processes.

If *pshared* has the value 0, then the semaphore is shared between the threads of a process, and should be located at some address that is visible to all threads (e.g., a global variable, or a variable allocated dynamically on the heap).

If *pshared* is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory (see [**shm\_open**(3)](/shm_open/3.md), [**mmap**(2)](/mmap/2.md), and [**shmget**(2)](/shmget/2.md)). (Since a child created by [**fork**(2)](/fork/2.md) inherits its parent's memory mappings, it can also access the semaphore.) Any process that can access the shared memory region can operate on the semaphore using [**sem\_post**(3)](/sem_post/3.md), [**sem\_wait**(3)](/sem_wait/3.md), and so on.

Initializing a semaphore that has already been initialized results in undefined behavior.

## RETURN VALUE

**sem\_init**() returns 0 on success; on error, -1 is returned, and *errno* is set to indicate the error.

## ERRORS

- **EINVAL**

  *value* exceeds **SEM\_VALUE\_MAX**.

- **ENOSYS**

  *pshared* is nonzero, but the system does not support process-shared semaphores (see [**sem\_overview**(7)](/sem_overview/7.md)).

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **sem\_init**() | Thread safety | MT-Safe |

## STANDARDS

POSIX.1-2008.

## HISTORY

POSIX.1-2001.

Bizarrely, POSIX.1-2001 does not specify the value that should be returned by a successful call to **sem\_init**(). POSIX.1-2008 rectifies this, specifying the zero return on success.

## EXAMPLES

See [**shm\_open**(3)](/shm_open/3.md) and [**sem\_wait**(3)](/sem_wait/3.md).

## SEE ALSO

[**sem\_destroy**(3)](/sem_destroy/3.md), [**sem\_post**(3)](/sem_post/3.md), [**sem\_wait**(3)](/sem_wait/3.md), [**sem\_overview**(7)](/sem_overview/7.md)
