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

# ualarm(3)

schedule signal after given number of microseconds

## NAME

ualarm - schedule signal after given number of microseconds

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <unistd.h>
```

**useconds\_t ualarm(useconds\_t** *usecs***, useconds\_t** *interval***);**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

**ualarm**():

```
    Since glibc 2.12:
        (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
            || /* glibc >= 2.19: */ _DEFAULT_SOURCE
            || /* glibc <= 2.19: */ _BSD_SOURCE
    Before glibc 2.12:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500
```

## DESCRIPTION

The **ualarm**() function causes the signal **SIGALRM** to be sent to the invoking process after (not less than) *usecs* microseconds. The delay may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers.

Unless caught or ignored, the **SIGALRM** signal will terminate the process.

If the *interval* argument is nonzero, further **SIGALRM** signals will be sent every *interval* microseconds after the first.

## RETURN VALUE

This function returns the number of microseconds remaining for any alarm that was previously set, or 0 if no alarm was pending.

## ERRORS

- **EINTR**

  Interrupted by a signal; see [**signal**(7)](/signal/7.md).

- **EINVAL**

  *usecs* or *interval* is not smaller than **1000000**. (On systems where that is considered an error.)

## ATTRIBUTES

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

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **ualarm**() | Thread safety | MT-Safe |

## STANDARDS

None.

## HISTORY

4\.3BSD, POSIX.1-2001. POSIX.1-2001 marks it as obsolete. Removed in POSIX.1-2008.

4\.3BSD, SUSv2, and POSIX do not define any errors.

POSIX.1-2001 does not specify what happens if the *usecs* argument is 0. On Linux (and probably most other systems), the effect is to cancel any pending alarm.

The type *useconds\_t* is an unsigned integer type capable of holding integers in the range \[0,1000000\]. On the original BSD implementation, and in glibc before glibc 2.1, the arguments to **ualarm**() were instead typed as *unsigned int*. Programs will be more portable if they never mention *useconds\_t* explicitly.

The interaction of this function with other timer functions such as [**alarm**(2)](/alarm/2.md), [**sleep**(3)](/sleep/3.md), [**nanosleep**(2)](/nanosleep/2.md), [**setitimer**(2)](/setitimer/2.md), [**timer\_create**(2)](/timer_create/2.md), [**timer\_delete**(2)](/timer_delete/2.md), [**timer\_getoverrun**(2)](/timer_getoverrun/2.md), [**timer\_gettime**(2)](/timer_gettime/2.md), [**timer\_settime**(2)](/timer_settime/2.md), [**usleep**(3)](/usleep/3.md) is unspecified.

This function is obsolete. Use [**setitimer**(2)](/setitimer/2.md) or POSIX interval timers ([**timer\_create**(2)](/timer_create/2.md), etc.) instead.

## SEE ALSO

[**alarm**(2)](/alarm/2.md), [**getitimer**(2)](/getitimer/2.md), [**nanosleep**(2)](/nanosleep/2.md), [**select**(2)](/select/2.md), [**setitimer**(2)](/setitimer/2.md), [**usleep**(3)](/usleep/3.md), [**time**(7)](/time/7.md)
