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

# exit(3)

perform normal program termination

Part of [\_Exit(3)](/_Exit/3.md).

## NAME

**exit**, **\_Exit** – perform normal program termination

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

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

*void*\

**exit**(*int status*);

*void*\

**\_Exit**(*int status*);

## DESCRIPTION

The **exit**() and **\_Exit**() functions terminate a process.

Before termination, **exit**() performs the following functions in the order listed:

1. Call all functions registered with the \_\_cxa\_atexit(3) function (which are typically destructors from the loaded dynamic objects), and the functions registered with the [atexit(3)](/atexit/3.md) function, in the reverse order of their registration.

2. Flush all open output streams.

3. Close all open streams.

The **\_Exit**() function terminates without calling the functions registered with the [atexit(3)](/atexit/3.md) function, and may or may not perform the other actions listed. The FreeBSD implementation of the **\_Exit**() function does not call destructors registered with \_\_cxa\_atexit(3), does not flush buffers, and does not close streams.

Both functions make the low-order eight bits of the *status* argument available to a parent process which has called a [wait(2)](/wait/2.md)-family function.

The C Standard (ISO/IEC 9899:1999 (“ISO C99”)) defines the values 0, EXIT\_SUCCESS, and EXIT\_FAILURE as possible values of *status*. Cooperating processes may use other values; in a program which might be called by a mail transfer agent, the values described in [sysexits(3)](/sysexits/3.md) may be used to provide more information to the parent process.

The complete *status* value is available as *si\_status* member of the *siginfo\_t* structure, to the [wait6(2)](/wait6/2.md) and [sigwaitinfo(2)](/sigwaitinfo/2.md) callers, and *SIGCHLD* signal handlers.

Calls to the **exit**() function are serialized. All functions registered by [atexit(3)](/atexit/3.md) are executed in the first thread that called **exit**. If any other thread of the process calls **exit** before all registered functions have completed or before the process terminates, the thread is blocked until the process terminates. The exit status of the process is the *status* argument of the first **exit** call which thread proceeds the atexit handlers.

Note that **exit**() does nothing to prevent bottomless recursion should a function registered using [atexit(3)](/atexit/3.md) itself call **exit**(). Such functions must call **\_Exit**() instead (although this has other effects as well which may not be desired).

## RETURN VALUES

The **exit**() and **\_Exit**() functions never return.

## SEE ALSO

[\_exit(2)](/_exit/2.md), [abort2(2)](/abort2/2.md), [wait(2)](/wait/2.md), [at\_quick\_exit(3)](/at_quick_exit/3.md), [atexit(3)](/atexit/3.md), [intro(3)](/intro/3.md), [quick\_exit(3)](/quick_exit/3.md), [sysexits(3)](/sysexits/3.md), [tmpfile(3)](/tmpfile/3.md)

## STANDARDS

The **exit**() and **\_Exit**() functions conform to ISO/IEC 9899:1999 (“ISO C99”).

## HISTORY

The **exit**() function appeared in Version 1 AT&T UNIX.
