HP-UX Reference (11i v2 07/12) - 2 System Calls (vol 5)
e
exit(2) exit(2)
NAME
exit(), _exit() - terminate process
SYNOPSIS
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
DESCRIPTION
exit() terminates the calling process and passes status to the system for inspection, see wait(2). Return-
ing from main in a C program has the same effect as
exit(); the status value is the function value
returned by main (this value is undefined if main does not take care to return a value or to call
exit()
explicitly).
If the calling process is multithreaded, all threads/lightweight process in the process will be terminated.
exit() cannot return to its caller. The result of an exit() call during exit processing is undefined.
The functions exit() and _exit(), are equivalent, except that exit() calls functions registered by
atexit() and flushes standard I/O buffers, while _exit() does not.
Both exit() and _exit() terminate the calling process with the following consequences. The exact
order of these consequences is unspecified.
• Functions registered by atexit() (see atexit(3)) are called in reverse order of registration.
• All file descriptors open in the calling process are closed.
• All files created by
tmpfile() are removed (see tmpfile(3S)).
• If the parent process of the calling process is executing a wait(), wait3(),or
waitpid(),itis
notified of the calling process’s termination, and the low-order eight bits; that is, bits 0377 of status are
made available to it (see wait(2)).
• If the parent process of the calling process is not executing a
wait(), wait3(),or
waitpid(), and
does not have
SIGCLD set to SIG_IGN, the calling process is transformed into a zombie process.A
zombie process is a process that only occupies a slot in the process table. It has no other space allo-
cated either in user or kernel space. Time accounting information is recorded for use by
times()
(see
times(2)).
• The parent process ID is set to 1 for all of the calling process’s existing child processes and zombie
processes. This means the initialization process (proc1) inherits each of these processes.
• Threads/LWPs terminated by a call to
exit() shall not invoke their cancellation cleanup handlers or
their thread specific data destructor functions.
• Each attached shared memory segment is detached and the value of
shm_nattach in the data struc-
ture associated with its shared memory identifier is decremented by 1 (see shmop(2)).
• For each semaphore for which the calling process has set a semadj value (see semop(2)), that semadj
value is added to the semval of the specified semaphore.
• If the process has a process, text, or data lock, an
unlock() is performed, see plock(2).
• An accounting record is written on the accounting file if the system’s accounting routine is enabled (see
acct(2)).
• A SIGCHLD signal is sent to the parent process.
• If the calling process is a controlling process, the SIGHUP signal is sent to each process in the fore-
ground process group of the controlling terminal belonging to the calling process. The controlling termi-
nal associated with the session is disassociated from the session, allowing it to be acquired by a new con-
trolling process.
• If the exit of the calling process causes a process group to become orphaned, and if any member of the
newly-orphaned process group is stopped, all processes in the newly-orphaned process group are sent
SIGHUP and SIGCONT signals.
90 Hewlett-Packard Company − 1 − HP-UX 11i Version 2: December 2007 Update