Previous: Aborting a Program, Up: Program Termination

#### 25.7.5 Termination Internals

The `_exit` function is the primitive used for process termination by `exit`. It is declared in the header file `unistd.h`.

— Function: void _exit (int status)

> The `_exit` function is the primitive for causing a process to terminate with status status. Calling this function does not execute cleanup functions registered with `atexit` or `on_exit`.

— Function: void _Exit (int status)

> The `_Exit` function is the ISO C equivalent to `_exit`. The ISO C committee members were not sure whether the definitions of `_exit` and `_Exit` were compatible so they have not used the POSIX name.

> This function was introduced in ISO C99 and is declared in `stdlib.h`.

When a process terminates for any reason—either because the program terminates, or as a result of a signal—the following things happen:

- All open file descriptors in the process are closed. See Low-Level I/O. Note that streams are not flushed automatically when the process terminates; see I/O on Streams.
- A process exit status is saved to be reported back to the parent process via `wait` or `waitpid`; see Process Completion. If the program exited, this status includes as its low-order 8 bits the program exit status.
- Any child processes of the process being terminated are assigned a new parent process. (On most systems, including GNU, this is the `init` process, with process ID 1.)
- A `SIGCHLD` signal is sent to the parent process.
- If the process is a session leader that has a controlling terminal, then a `SIGHUP` signal is sent to each process in the foreground job, and the controlling terminal is disassociated from that session. See Job Control.
- If termination of a process causes a process group to become orphaned, and any member of that process group is stopped, then a `SIGHUP` signal and a `SIGCONT` signal are sent to each process in the group. See Job Control.