---
name: "sem_clockwait_np"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/sem_clockwait_np"
---

# sem\_clockwait\_np(3)

lock a semaphore

## NAME

**sem\_timedwait**, **sem\_clockwait\_np** – lock a semaphore

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

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

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

*int*\

**sem\_timedwait**(*sem\_t \* restrict sem*, *const struct timespec \* restrict abs\_timeout*);

*int*\

**sem\_clockwait\_np**(*sem\_t \* restrict sem*, *clockid\_t clock\_id*, *int flags*, *const struct timespec \* rqtp*, *struct timespec \* rmtp*);

## DESCRIPTION

The **sem\_timedwait**() function locks the semaphore referenced by *sem*, as in the [sem\_wait(3)](/sem_wait/3.md) function. However, if the semaphore cannot be locked without waiting for another process or thread to unlock the semaphore by performing a [sem\_post(3)](/sem_post/3.md) function, this wait will be terminated when the specified timeout expires.

The timeout will expire when the absolute time specified by *abs\_timeout* passes, as measured by the clock on which timeouts are based (that is, when the value of that clock equals or exceeds *abs\_timeout*), or if the absolute time specified by *abs\_timeout* has already been passed at the time of the call.

Note that the timeout is based on the CLOCK\_REALTIME clock.

The validity of the *abs\_timeout* is not checked if the semaphore can be locked immediately.

The **sem\_clockwait\_np**() function is a more flexible variant of **sem\_timedwait**(). The *clock\_id* parameter specifies the reference clock. If the *flags* parameter contains TIMER\_ABSTIME, then the requested timeout (*rqtp*) is an absolute timeout; otherwise, the timeout is relative. If this function fails with EINTR and the timeout is relative, a non-NULL *rmtp* will be updated to contain the amount of time remaining in the interval( the requested time minus the time actually slept). An absolute timeout has no effect on *rmtp*. A single structure can be used for both *rqtp* and *rmtp*.

## RETURN VALUES

These functions return zero if the calling process successfully performed the semaphore lock operation on the semaphore designated by *sem*. If the call was unsuccessful, the state of the semaphore is unchanged, and the function returns a value of -1 and sets the global variable *errno* to indicate the error.

## ERRORS

These functions will fail if:

- \[EINVAL\]

  The *sem* argument does not refer to a valid semaphore, or the process or thread would have blocked, and the *abs\_timeout* parameter specified a nanoseconds field value less than zero or greater than or equal to 1000 million.

- \[ETIMEDOUT\]

  The semaphore could not be locked before the specified timeout expired.

- \[EINTR\]

  A signal interrupted this function.

## SEE ALSO

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

## STANDARDS

The **sem\_timedwait**() function conforms to IEEE Std 1003.1-2004 (“POSIX.1”). The **sem\_clockwait\_np**() function is not specified by any standard; it exists only on FreeBSD at the time of this writing.

## HISTORY

The **sem\_timedwait**() function first appeared in FreeBSD 5.0. The **sem\_clockwait\_np**() function first appeared in FreeBSD 11.1.
