EXITS(2)                                                 EXITS(2)

          exits, _exits, atexit, atexitdont, terminate - terminate
          process, process cleanup

          #include <u.h>
          #include <libc.h>

          void _exits(char *msg)
          void exits(char *msg)

          int  atexit(void(*)(void))

          void atexitdont(void(*)(void))

          Exits is the conventional way to terminate a process.
          _Exits is the underlying system call.  They can never

          Msg conventionally includes a brief (maximum length ERRLEN)
          explanation of the reason for exiting, or a null pointer or
          empty string to indicate normal termination.  The string is
          passed to the parent process, prefixed by the name and pro-
          cess id of the exiting process, when the parent does a

          Before calling _exits with msg as an argument, exits calls
          in reverse order all the functions recorded by atexit.

          Atexit records fn as a function to be called by exits. It
          returns zero if it failed, nonzero otherwise.  A typical use
          is to register a cleanup routine for an I/O package.  To
          simplify programs that fork or share memory, exits only
          calls those atexit-registered functions that were registered
          by the same process as that calling exits.

          Calling atexit twice (or more) with the same function argu-
          ment causes exits to invoke the function twice (or more).

          There is a limit to the number of exit functions that will
          be recorded; atexit returns 0 if that limit has been

          Atexitdont cancels a previous registration of an exit func-


     EXITS(2)                                                 EXITS(2)

          fork(2), wait(2)