Provided by: manpages-posix-dev_2.16-1_all bug

NAME

       exit, _Exit, _exit - terminate a process

SYNOPSIS

       #include <stdlib.h>

       void exit(int status);
       void _Exit(int status);

       #include <unistd.h>
       void _exit(int status);

DESCRIPTION

       For  exit()  and  _Exit():   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 IEEE Std 1003.1-2001 defers to the ISO C
       standard.

       The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE,  or any other value, though only
       the  least  significant  8  bits  (that is, status & 0377) shall be available to a waiting
       parent process.

       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. If exit() is called more than once, the behavior is undefined.

       The  exit() function shall then flush all open streams with unwritten buffered data, close
       all open streams, and remove all files created by tmpfile().  Finally,  control  shall  be
       terminated with the consequences described below.

       The _Exit() and _exit() functions shall be functionally equivalent.

       The  _Exit()     and  _exit()  functions shall not call functions registered with atexit()
       nor any registered signal handlers.  Whether  open  streams  are  flushed  or  closed,  or
       temporary  files  are  removed  is implementation-defined. Finally, the calling process is
       terminated with the consequences described below.

       These functions shall terminate the calling process    with the following consequences:

       Note:  These consequences are all extensions to the ISO C standard and are not further  CX
              shaded. However, XSI extensions are shaded.

        * All  of the file descriptors, directory streams,    conversion descriptors, and message
          catalog descriptors   open in the calling process shall be closed.

        * If the parent process of the calling process is executing a wait() or waitpid(),    and
          has neither set its SA_NOCLDWAIT flag nor set SIGCHLD to SIG_IGN,  it shall be notified
          of the calling process' termination and the low-order eight bits (that is,  bits  0377)
          of  status  shall  be  made  available to it. If the parent is not waiting, the child's
          status shall be made available to it when the parent subsequently  executes  wait()  or
          waitpid().

       The semantics of the waitid() function shall be equivalent to wait().

        * If  the  parent  process of the calling process is not executing a wait() or waitpid(),
           and has neither set its SA_NOCLDWAIT flag nor set SIGCHLD  to  SIG_IGN,   the  calling
          process  shall  be  transformed  into a zombie process. A zombie process is an inactive
          process and it shall be deleted at some later time when  its  parent  process  executes
          wait() or waitpid().

       The semantics of the waitid() function shall be equivalent to wait().

        * Termination  of  a  process does not directly terminate its children.  The sending of a
          SIGHUP signal as described below indirectly terminates children in some circumstances.

        * Either:

       If the implementation supports the SIGCHLD signal, a SIGCHLD shall be sent to  the  parent
       process.

       Or:

       If the parent process has set its SA_NOCLDWAIT flag, or set SIGCHLD to SIG_IGN, the status
       shall be discarded, and the lifetime of the calling  process  shall  end  immediately.  If
       SA_NOCLDWAIT  is set, it is implementation-defined whether a SIGCHLD signal is sent to the
       parent process.

        * The parent process ID of all of the  calling  process'  existing  child  processes  and
          zombie  processes  shall  be  set to the process ID of an implementation-defined system
          process. That is, these processes shall be inherited by a special system process.

        * Each attached shared-memory segment is  detached  and  the  value  of  shm_nattch  (see
          shmget())  in  the  data  structure  associated  with  its  shared  memory  ID shall be
          decremented by 1.

        * For each semaphore for which the calling process has set a semadj value (see semop() ),
          that value shall be added to the semval of the specified semaphore.

        * If  the  process  is  a  controlling  process,  the SIGHUP signal shall be sent to each
          process in the foreground process group of the controlling terminal  belonging  to  the
          calling process.

        * If  the  process is a controlling process, the controlling terminal associated with the
          session shall be disassociated from the session, allowing it to be acquired  by  a  new
          controlling process.

        * 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 shall be sent to each process in the newly-orphaned process group.

        * All  open  named semaphores in the calling process shall be closed as if by appropriate
          calls to sem_close().

        * Any memory locks established by the process via calls to mlockall() or mlock() shall be
          removed.  If  locked  pages in the address space of the calling process are also mapped
          into the address spaces of other processes and are locked by those processes, the locks
          established  by  the other processes shall be unaffected by the call by this process to
          _Exit() or _exit().

        * Memory mappings that were created in the process shall be unmapped before  the  process
          is destroyed.

        * Any  blocks  of typed memory that were mapped in the calling process shall be unmapped,
          as if munmap() was implicitly called to unmap them.

        * All open message queue descriptors in the calling process shall  be  closed  as  if  by
          appropriate calls to mq_close().

        * Any  outstanding  cancelable  asynchronous  I/O  operations  may  be  canceled.   Those
          asynchronous I/O operations that are not canceled shall complete as if the  _Exit()  or
          _exit()  operation  had not yet occurred, but any associated signal notifications shall
          be suppressed. The _Exit() or _exit() operation may block awaiting such I/O completion.
          Whether  any I/O is canceled, and which I/O may be canceled upon _Exit() or _exit(), is
          implementation-defined.

        * Threads terminated by a call to _Exit() or _exit() shall not invoke their  cancellation
          cleanup handlers or per-thread data destructors.

        * If  the  calling  process  is  a  trace controller process, any trace streams that were
          created  by  the  calling  process  shall  be   shut   down   as   described   by   the
          posix_trace_shutdown() function, and any process' mapping of trace event names to trace
          event type identifiers built for these trace streams may be deallocated.

RETURN VALUE

       These functions do not return.

ERRORS

       No errors are defined.

       The following sections are informative.

EXAMPLES

       None.

APPLICATION USAGE

       Normally applications should use exit() rather than _Exit() or _exit().

RATIONALE

   Process Termination
       Early proposals drew a  distinction  between  normal  and  abnormal  process  termination.
       Abnormal  termination  was  caused only by certain signals and resulted in implementation-
       defined "actions", as discussed below. Subsequent proposals distinguished three  types  of
       termination:  normal  termination  (as  in  the  current  specification),  simple abnormal
       termination, and abnormal termination with actions. Again the distinction between the  two
       types  of  abnormal  termination  was  that they were caused by different signals and that
       implementation-defined actions would result in the latter case. Given that  these  actions
       were  completely  implementation-defined,  the  early  proposals were only saying when the
       actions could occur and how their occurrence could be detected, but not  what  they  were.
       This  was  of little or no use to conforming applications, and thus the distinction is not
       made in this volume of IEEE Std 1003.1-2001.

       The implementation-defined actions usually include, in  most  historical  implementations,
       the  creation  of  a file named core in the current working directory of the process. This
       file contains an image of the memory of the process, together with descriptive information
       about  the  process,  perhaps  sufficient  to  reconstruct the state of the process at the
       receipt of the signal.

       There is a potential security problem in creating a core file if the process was set-user-
       ID  and  the current user is not the owner of the program, if the process was set-group-ID
       and none of the user's groups match the group of the program, or if the user does not have
       permission  to write in the current directory. In this situation, an implementation either
       should not create a core file or should make it unreadable by the user.

       Despite the silence of this volume of IEEE Std 1003.1-2001 on this  feature,  applications
       are  advised  not  to  create  files  named  core  because  of potential conflicts in many
       implementations.  Some implementations use a name  other  than  core  for  the  file;  for
       example, by appending the process ID to the filename.

   Terminating a Process
       It is important that the consequences of process termination as described occur regardless
       of whether the process called _exit() (perhaps indirectly through exit()) or  instead  was
       terminated  due  to  a  signal or for some other reason. Note that in the specific case of
       exit() this means that the status argument to exit() is treated in the  same  way  as  the
       status argument to _exit().

       A  language  other than C may have other termination primitives than the C-language exit()
       function, and programs written in such  a  language  should  use  its  native  termination
       primitives,  but  those  should  have as part of their function the behavior of _exit() as
       described. Implementations in languages other than C are outside the scope of this version
       of this volume of IEEE Std 1003.1-2001, however.

       As  required  by the ISO C standard, using return from main() has the same behavior (other
       than with respect to language scope issues) as calling exit()  with  the  returned  value.
       Reaching the end of the main() function has the same behavior as calling exit(0).

       A  value  of  zero (or EXIT_SUCCESS, which is required to be zero) for the argument status
       conventionally indicates successful termination. This corresponds to the specification for
       exit()  in  the  ISO C  standard. The convention is followed by utilities such as make and
       various shells, which interpret a zero status from a child process as  success.  For  this
       reason,   applications   should   not   call  exit(0)  or  _exit(0)  when  they  terminate
       unsuccessfully; for example, in signal-catching functions.

       Historically, the implementation-defined process that inherits children whose parents have
       terminated without waiting on them is called init and has a process ID of 1.

       The  sending  of  a  SIGHUP  to  the  foreground  process group when a controlling process
       terminates corresponds to somewhat different historical implementations. In System V,  the
       kernel  sends  a SIGHUP on termination of (essentially) a controlling process. In 4.2 BSD,
       the kernel does not send SIGHUP in a case like this, but the termination of a  controlling
       process  is  usually  noticed  by  a system daemon, which arranges to send a SIGHUP to the
       foreground process group with the vhangup() function. However, in  4.2  BSD,  due  to  the
       behavior  of  the  shells  that  support job control, the controlling process is usually a
       shell with no other processes in its process group. Thus, a change to make _exit()  behave
       this way in such systems should not cause problems with existing applications.

       The termination of a process may cause a process group to become orphaned in either of two
       ways. The connection of a process group to its parent(s) outside of the group  depends  on
       both  the  parents  and  their  children.  Thus,  a  process  group may be orphaned by the
       termination of the last  connecting  parent  process  outside  of  the  group  or  by  the
       termination  of  the  last direct descendant of the parent process(es). In either case, if
       the termination of a process causes a process group to become orphaned,  processes  within
       the  group  are  disconnected  from  their  job  control  shell,  which  no longer has any
       information on the existence of the process group.  Stopped  processes  within  the  group
       would  languish  forever.   In  order to avoid this problem, newly orphaned process groups
       that contain stopped processes are sent a SIGHUP signal and a SIGCONT signal  to  indicate
       that  they have been disconnected from their session. The SIGHUP signal causes the process
       group members to terminate unless  they  are  catching  or  ignoring  SIGHUP.  Under  most
       circumstances,  all  of  the  members  of the process group are stopped if any of them are
       stopped.

       The action of sending a SIGHUP and a SIGCONT signal to members of a newly orphaned process
       group  is similar to the action of 4.2 BSD, which sends SIGHUP and SIGCONT to each stopped
       child of an exiting process. If  such  children  exit  in  response  to  the  SIGHUP,  any
       additional  descendants  receive  similar  treatment  at  that  time.   In  this volume of
       IEEE Std 1003.1-2001, the signals are sent to the entire process group at the  same  time.
       Also, in this volume of IEEE Std 1003.1-2001, but not in 4.2 BSD, stopped processes may be
       orphaned, but may be members of a process group  that  is  not  orphaned;  therefore,  the
       action taken at _exit() must consider processes other than child processes.

       It  is  possible for a process group to be orphaned by a call to setpgid() or setsid(), as
       well as by process termination. This  volume  of  IEEE Std 1003.1-2001  does  not  require
       sending  SIGHUP  and  SIGCONT  in  those cases, because, unlike process termination, those
       cases are not caused accidentally by applications that are  unaware  of  job  control.  An
       implementation  can choose to send SIGHUP and SIGCONT in those cases as an extension; such
       an extension must be documented as required in <signal.h>.

       The ISO/IEC 9899:1999 standard adds the _Exit() function that results in immediate program
       termination    without   triggering   signals   or   atexit()-registered   functions.   In
       IEEE Std 1003.1-2001, this is equivalent to the _exit() function.

FUTURE DIRECTIONS

       None.

SEE ALSO

       atexit()   ,   close()   ,   fclose()   ,    longjmp()    ,    posix_trace_shutdown()    ,
       posix_trace_trid_eventid_open()  ,  semop() , shmget() , sigaction() , wait() , waitid() ,
       waitpid() , the Base Definitions volume of IEEE Std 1003.1-2001, <stdlib.h>, <unistd.h>

COPYRIGHT

       Portions of this text are reprinted and  reproduced  in  electronic  form  from  IEEE  Std
       1003.1,  2003  Edition,  Standard  for Information Technology -- Portable Operating System
       Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003  by
       the  Institute  of  Electrical  and  Electronics Engineers, Inc and The Open Group. In the
       event of any discrepancy between this version and the original IEEE  and  The  Open  Group
       Standard,  the  original  IEEE  and  The  Open Group Standard is the referee document. The
       original Standard can be obtained online at http://www.opengroup.org/unix/online.html .