---
name: "atexit"
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/atexit"
---

# atexit(3)

register a function to be called at normal process termination

## NAME

atexit - register a function to be called at normal process termination

## LIBRARY

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

## SYNOPSIS

```
#include <stdlib.h>
```

**int atexit(typeof(void (void)) \****function***);**

## DESCRIPTION

The **atexit**() function registers the given *function* to be called at normal process termination, either via [**exit**(3)](/exit/3.md) or via return from the program's *main*(). Functions so registered are called in the reverse order of their registration; no arguments are passed.

The same function may be registered multiple times: it is called once for each registration.

POSIX.1 requires that an implementation allow at least **ATEXIT\_MAX** (32) such functions to be registered. The actual limit supported by an implementation can be obtained using [**sysconf**(3)](/sysconf/3.md).

When a child process is created via [**fork**(2)](/fork/2.md), it inherits copies of its parent's registrations. Upon a successful call to one of the [**exec**(3)](/exec/3.md) functions, all registrations are removed.

## RETURN VALUE

The **atexit**() function returns the value 0 if successful; otherwise, it returns a nonzero value.

## ATTRIBUTES

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

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

## VERSIONS

POSIX.1 says that the result of calling [**exit**(3)](/exit/3.md) more than once (i.e., calling [**exit**(3)](/exit/3.md) within a function registered using **atexit**()) is undefined. On some systems (but not Linux), this can result in an infinite recursion; portable programs should not invoke [**exit**(3)](/exit/3.md) inside a function registered using **atexit**().

## STANDARDS

C11, POSIX.1-2008.

## HISTORY

POSIX.1-2001, C89, C99, SVr4, 4.3BSD.

## NOTES

Functions registered using **atexit**() (and [**on\_exit**(3)](/on_exit/3.md)) are not called if a process terminates abnormally because of the delivery of a signal.

If one of the registered functions calls [**\_exit**(3)](/_exit/3.md), then any remaining functions are not invoked, and the other process termination steps performed by [**exit**(3)](/exit/3.md) are not performed.

The **atexit**() and [**on\_exit**(3)](/on_exit/3.md) functions register functions on the same list: at normal process termination, the registered functions are invoked in reverse order of their registration by these two functions.

According to POSIX.1, the result is undefined if [**longjmp**(3)](/longjmp/3.md) is used to terminate execution of one of the functions registered using **atexit**().

### Linux notes

Since glibc 2.2.3, **atexit**() (and [**on\_exit**(3)](/on_exit/3.md)) can be used within a shared library to establish functions that are called when the shared library is unloaded.

## EXAMPLES

```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
bye(void)
{
    printf("That was all, folks\n");
}
int
main(void)
{
    long a;
    int i;
    a = sysconf(_SC_ATEXIT_MAX);
    printf("ATEXIT_MAX = %ld\n", a);
    i = atexit(bye);
    if (i != 0) {
        fprintf(stderr, "cannot set exit function\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}
```

## SEE ALSO

[**dlopen**(3)](/dlopen/3.md), [**\_exit**(3)](/_exit/3.md), [**exit**(3)](/exit/3.md), [**on\_exit**(3)](/on_exit/3.md)
