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

# on\_exit(3)

register a function to be called at normal process termination

## NAME

on\_exit - register a function to be called at normal process termination

## LIBRARY

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

## SYNOPSIS

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

**int on\_exit(typeof(void (int, void \*)) \****function***, void \****arg***);**

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

**on\_exit**():

```
    Since glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 and earlier:
        _BSD_SOURCE || _SVID_SOURCE
```

## DESCRIPTION

The **on\_exit**() function registers the given *function* to be called at normal process termination, whether via [**exit**(3)](/exit/3.md) or via return from the program's *main*(). The *function* is passed the status argument given to the last call to [**exit**(3)](/exit/3.md) and the *arg* argument from **on\_exit**().

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

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 **on\_exit**() 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** |
| **on\_exit**() | Thread safety | MT-Safe |

## STANDARDS

None.

## HISTORY

SunOS 4, glibc. Removed in Solaris (SunOS 5). Use the standard [**atexit**(3)](/atexit/3.md) instead.

## CAVEATS

By the time *function* is executed, stack (*auto*) variables may already have gone out of scope. Therefore, *arg* should not be a pointer to a stack variable; it may however be a pointer to a heap variable or a global variable.

## SEE ALSO

[**atexit**(3)](/atexit/3.md), [**\_exit**(3)](/_exit/3.md), [**exit**(3)](/exit/3.md)
