---
name: "atexit"
section: "3"
platform: "macos"
package: "Libc"
version: "1752.120.2"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/atexit"
---

# atexit(3)

register a function to be called on exit

## NAME

**atexit** – register a function to be called on exit

## SYNOPSIS

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

*int*\

**atexit**(*void (\*function)(void)*); #ifdef UNIFDEF\_BLOCKS

*int*\

**atexit\_b**(*void (^function)(void)*); #endif

## DESCRIPTION

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

If the provided *function* is located in a library that has been dynamically loaded (e.g. by **dlopen**(*)*, *Ns*), it will be called when the library is unloaded (due to a call to **dlclose**()) or at program exit. #ifdef UNIFDEF\_BLOCKS

The **atexit\_b**() function is like **atexit**() except the callback is a block pointer instead of a function pointer.

Note: The **Block\_copy**() function (defined in ⟨Blocks.h⟩) is used by **atexit\_b**() to make a copy of the block, especially for the case when a stack-based block might go out of scope when the subroutine returns.

\#endif

These functions must not call **exit**(); if it should be necessary to terminate the process while in such a function, the [\_exit(2)](/_exit/2.md) function should be used. (Alternatively, the function may cause abnormal process termination, for example by calling [abort(3)](/abort/3.md).)

At least 32 functions can always be registered, and more are allowed as long as sufficient memory can be allocated.

## RETURN VALUES

\#ifdef UNIFDEF\_BLOCKS #endif The **atexit()** and **atexit\_b()** functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## ERRORS

- \[ENOMEM\]

  No memory was available to add the function to the list. The existing list of functions is unmodified.

## SEE ALSO

[exit(3)](/exit/3.md)

## STANDARDS

The **atexit**() function conforms to ISO/IEC 9899:1990 (“ISO C90”).
