---
name: "sem_init"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
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

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<semaphore.h\>**

*int*\

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

## DESCRIPTION

The **sem\_init**() function initializes the unnamed semaphore pointed to by *sem* to have the value *value*.

A non-zero value for *pshared* specifies a shared semaphore that can be used by multiple processes, the semaphore should be located in shared memory region (see [mmap(2)](/mmap/2.md), [shm\_open(2)](/shm_open/2.md), and [shmget(2)](/shmget/2.md)), any process having read and write access to address *sem* can perform semaphore operations on *sem*.

Following a successful call to **sem\_init**(), *sem* can be used as an argument in subsequent calls to [sem\_wait(3)](/sem_wait/3.md), [sem\_trywait(3)](/sem_trywait/3.md), [sem\_post(3)](/sem_post/3.md), and [sem\_destroy(3)](/sem_destroy/3.md). The *sem* argument is no longer valid after a successful call to [sem\_destroy(3)](/sem_destroy/3.md).

## RETURN VALUES

The **sem\_init()** function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## ERRORS

The **sem\_init**() function will fail if:

- \[EINVAL\]

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

- \[ENOSPC\]

  Memory allocation error.

## SEE ALSO

[sem\_destroy(3)](/sem_destroy/3.md), [sem\_getvalue(3)](/sem_getvalue/3.md), [sem\_post(3)](/sem_post/3.md), [sem\_trywait(3)](/sem_trywait/3.md), [sem\_wait(3)](/sem_wait/3.md)

## STANDARDS

The **sem\_init**() function conforms to ISO/IEC 9945-1:1996 (“POSIX.1”).
