NAME

exit — terminate a process

SYNOPSIS

#include <stdlib.h>

void exit(int
status);

DESCRIPTION

[CX] [Option Start] The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of POSIX.1-2024 defers to the ISO C standard. [Option End]

The exit() function shall cause normal process termination to occur. No functions registered by the at_quick_exit() function shall be called. If a process calls the exit() function more than once, or calls the quick_exit() function in addition to the exit() function, the behavior is undefined.

The value of status can be 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] [Option Start]  or any other value, though only the least significant 8 bits (that is, status & 0377) shall be available from wait() and waitpid(); the full value shall be available from waitid() and in the siginfo_t passed to a signal handler for SIGCHLD. [Option End]

The exit() function shall first call all functions registered by atexit(), in the reverse order of their registration, except that a function is called after any previously registered functions that had already been called at the time it was registered. Each function is called as many times as it was registered. If, during the call to any such function, a call to the longjmp() function is made that would terminate the call to the registered function, the behavior is undefined.

If a function registered by a call to atexit() fails to return, the remaining registered functions shall not be called and the rest of the exit() processing shall not be completed.

The exit() function shall then flush all open streams with unwritten buffered data. [CX] [Option Start] For each stream which is the active handle to its underlying file descriptor, and for which the file is not already at EOF and is capable of seeking, the file offset of the underlying open file description shall be set to the file position of the stream. For each open stream, the exit() function shall perform the equivalent of a close() on the file descriptor that is associated with the stream. [Option End] Finally, the process shall be terminated [CX] [Option Start]  with the same consequences as described in Consequences of Process Termination . [Option End]

RETURN VALUE

The exit() function does not return.

ERRORS

No errors are defined.


The following sections are informative.

EXAMPLES

See APPLICATION USAGE.

APPLICATION USAGE

When a stream that has unwritten buffered data is flushed by exit() there is no way for the calling process to discover whether or not exit() successfully wrote the data to the underlying file descriptor. Therefore, it is strongly recommended that applications always ensure there is no unwritten buffered data in any stream when calling exit(), or returning from the initial call to main(), with a status value that indicates no errors occurred.

For example, the following code demonstrates one way to ensure that stdout has already been successfully flushed before calling exit() with status 0. If the flush fails, the file descriptor underlying stdout is closed so that exit() will not try to repeat the failed write operation. If the flush succeeds, a final check with ferror() is performed to ensure that there were no write errors during earlier flush operations (that were not handled at the time).

int status = 0;
if (fflush(stdout) != 0) {
    perror("appname: standard output");
    close(fileno(stdout));
    status = 1;
}
else if (ferror(stdout)) {
    fputs("appname: write error on standard output\n", stderr);
    status = 1;
}
exit(status);

See also _Exit().

RATIONALE

See _Exit().

FUTURE DIRECTIONS

None.

SEE ALSO

_Exit , at_quick_exit , atexit , exec , fflush , longjmp , quick_exit , tmpfile , wait , waitid

XBD <stdlib.h>

CHANGE HISTORY

Issue 7

Austin Group Interpretation 1003.1-2001 #031 is applied, separating the _Exit() and _exit() functions from the exit() function.

Austin Group Interpretation 1003.1-2001 #085 is applied.

POSIX.1-2008, Technical Corrigendum 2, XSH/TC2-2008/0100 [594] is applied.

Issue 8

Austin Group Defect 610 is applied, clarifying the effects of exit() on open streams.

Austin Group Defect 1302 is applied, aligning this function with the ISO/IEC 9899:2018 standard.

Austin Group Defect 1490 is applied, changing the EXAMPLES and APPLICATION USAGE sections.

Austin Group Defect 1629 is applied, changing the APPLICATION USAGE section.

End of informative text.