exit(2) System Calls exit(2)
exit, _Exit, _exit - terminate process
void exit(int status);
void _Exit(int status);
void _exit(int status);
The exit() function first calls all functions registered by atexit(3C),
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(3C) 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(3C) fails to return, the
remaining registered functions are not called and the rest of the
exit() processing is not completed. If exit() is called more than once,
the effects are undefined.
The exit() function then flushes all open streams with unwritten
buffered data, closes all open streams, and removes all files created
The _Exit() and _exit() functions are functionally equivalent. They do
not call functions registered with atexit(), do not call any registered
signal handlers, and do not flush open streams.
The _exit(), _Exit(), and exit() functions terminate the calling
process with the following consequences:
o All of the file descriptors, directory streams, conversion
descriptors and message catalogue descriptors open in the calling
process are closed.
o If the parent process of the calling process is executing a
wait(3C), wait3(3C), waitid(2), or waitpid(3C), and has neither
set its SA_NOCLDWAIT flag nor set SIGCHLD to SIG_IGN, it is noti-
fied of the calling process's termination and the low-order eight
bits (that is, bits 0377) of status are made available to it. If
the parent is not waiting, the child's status will be made avail-
able to it when the parent subsequently executes wait(), wait3(),
waitid(), or waitpid().
o If the parent process of the calling process is not executing a
wait(), wait3(), waitid(), or waitpid(), and has not set its
SA_NOCLDWAIT flag, or set SIGCHLD to SIG_IGN, the calling process
is transformed into a zombie process. A zombie process is an inac-
tive process and it will be deleted at some later time when its
parent process executes wait(), wait3(), waitid(), or waitpid(). A
zombie process only occupies a slot in the process table; it has
no other space allocated either in user or kernel space. The
process table slot that it occupies is partially overlaid with
time accounting information (see <<sys/proc.h>>) to be used by the
o Termination of a process does not directly terminate its children.
The sending of a SIGHUP signal as described below indirectly ter-
minates children in some circumstances.
o A SIGCHLD will be sent to the parent process.
o The parent process ID of all of the calling process's existing
child processes and zombie processes is set to 1. That is, these
processes are inherited by the initialization process (see
o Each mapped memory object is unmapped.
o Each attached shared-memory segment is detached and the value of
shm_nattch (see shmget(2)) in the data structure associated with
its shared memory ID is decremented by 1.
o For each semaphore for which the calling process has set a semadj
value (see semop(2)), that value is added to the semval of the
o If the process is a controlling process, the SIGHUP signal will be
sent to each process in the foreground process group of the con-
trolling terminal belonging to the calling process.
o If the process is a controlling process, the controlling terminal
associated with the session is disassociated from the session,
allowing it to be acquired by a new controlling process.
o If the exit of the process causes a process group to become
orphaned, and if any member of the newly-orphaned process group is
stopped, then a SIGHUP signal followed by a SIGCONT signal will be
sent to each process in the newly-orphaned process group.
o If the parent process has set its SA_NOCLDWAIT flag, or set
SIGCHLD to SIG_IGN, the status will be discarded, and the lifetime
of the calling process will end immediately.
o If the process has process, text or data locks, an UNLOCK is per-
formed (see plock(3C) and memcntl(2)).
o All open named semaphores in the process are closed as if by
appropriate calls to sem_close(3RT). All open message queues in
the process are closed as if by appropriate calls to
mq_close(3RT). Any outstanding asynchronous I/O operations may be
o An accounting record is written on the accounting file if the sys-
tem's accounting routine is enabled (see acct(2)).
o An extended accounting record is written to the extended process
accounting file if the system's extended process accounting facil-
ity is enabled (see acctadm(1M)).
o If the current process is the last process within its task and if
the system's extended task accounting facility is enabled (see
acctadm(1M)), an extended accounting record is written to the
extended task accounting file.
These functions do not return.
No errors are defined.
Normally applications should use exit() rather than _exit().
See attributes(5) for descriptions of the following attributes:
tab() allbox; cw(2.750000i)| cw(2.750000i) lw(2.750000i)|
lw(2.750000i). ATTRIBUTE TYPEATTRIBUTE VALUE Interface StabilityStan-
dard MT-LevelSee below.
The _exit() and _Exit() functions are Async-Signal-Safe.
acctadm(1M), intro(2), acct(2), close(2), memcntl(2), semop(2),
shmget(2), sigaction(2), times(2), waitid(2), atexit(3C), fclose(3C),
mq_close(3RT), plock(3C), signal.h(3HEAD), tmpfile(3C), wait(3C),
wait3(3C), waitpid(3C), attributes(5), standards(5)
SunOS 5.10 10 Dec 2003 exit(2)