---
name: "sem_destroy"
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_destroy"
---

# sem\_destroy(3)

destroy an unnamed semaphore

## NAME

**sem\_destroy** – destroy an unnamed semaphore

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

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

*int*\

**sem\_destroy**(*sem\_t \*sem*);

## DESCRIPTION

The **sem\_destroy**() function destroys the unnamed semaphore pointed to by *sem*. After a successful call to **sem\_destroy**(), *sem* is unusable until re-initialized by another call to [sem\_init(3)](/sem_init/3.md).

## RETURN VALUES

The **sem\_destroy()** 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\_destroy**() function will fail if:

- \[EINVAL\]

  The *sem* argument points to an invalid semaphore.

- \[EBUSY\]

  There are currently threads blocked on the semaphore that *sem* points to.

## SEE ALSO

[sem\_init(3)](/sem_init/3.md)

## STANDARDS

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

POSIX does not define the behavior of **sem\_destroy**() if called while there are threads blocked on *sem*, but this implementation is guaranteed to return -1 and set *errno* to EBUSY if there are threads blocked on *sem*.
