@node Program Basics, Processes, Signal Handling, Top
@c %MENU% Writing the beginning and end of your program
@chapter The Basic Program/System Interface

@cindex process
@cindex program
@cindex address space
@cindex thread of control
@dfn{Processes} are the primitive units for allocation of system
resources.  Each process has its own address space and (usually) one
thread of control.  A process executes a program; you can have multiple
processes executing the same program, but each process has its own copy
of the program within its own address space and executes it
independently of the other copies.  Though it may have multiple threads
of control within the same program and a program may be composed of
multiple logically separate modules, a process always executes exactly
one program.

Note that we are using a specific definition of ``program'' for the
purposes of this manual, which corresponds to a common definition in the
context of Unix system.  In popular usage, ``program'' enjoys a much
broader definition; it can refer for example to a system's kernel, an
editor macro, a complex package of software, or a discrete section of
code executing within a process.

Writing the program is what this manual is all about.  This chapter
explains the most basic interface between your program and the system
that runs, or calls, it.  This includes passing of parameters (arguments
and environment) from the system, requesting basic services from the
system, and telling the system the program is done.

A program starts another program with the @code{exec} family of system calls.
This chapter looks at program startup from the execee's point of view.  To
see the event from the execor's point of view, see @ref{Executing a File}.

@menu
* Program Arguments::           Parsing your program's command-line arguments
* Environment Variables::       Less direct parameters affecting your program
* Auxiliary Vector::            Least direct parameters affecting your program
* System Calls::                Requesting service from the system
* Program Termination::         Telling the system you're done; return status
@end menu

@node Program Arguments, Environment Variables, , Program Basics
@section Program Arguments
@cindex program arguments
@cindex command line arguments
@cindex arguments, to program

@cindex program startup
@cindex startup of program
@cindex invocation of program
@cindex @code{main} function
@findex main
The system starts a C program by calling the function @code{main}.  It
is up to you to write a function named @code{main}---otherwise, you
won't even be able to link your program without errors.

In @w{ISO C} you can define @code{main} either to take no arguments, or to
take two arguments that represent the command line arguments to the
program, like this:

@smallexample
int main (int @var{argc}, char *@var{argv}[])
@end smallexample

@cindex argc (program argument count)
@cindex argv (program argument vector)
The command line arguments are the whitespace-separated tokens given in
the shell command used to invoke the program; thus, in @samp{cat foo
bar}, the arguments are @samp{foo} and @samp{bar}.  The only way a
program can look at its command line arguments is via the arguments of
@code{main}.  If @code{main} doesn't take arguments, then you cannot get
at the command line.

The value of the @var{argc} argument is the number of command line
arguments.  The @var{argv} argument is a vector of C strings; its
elements are the individual command line argument strings.  The file
name of the program being run is also included in the vector as the
first element; the value of @var{argc} counts this element.  A null
pointer always follows the last element: @code{@var{argv}[@var{argc}]}
is this null pointer.

For the command @samp{cat foo bar}, @var{argc} is 3 and @var{argv} has
three elements, @code{"cat"}, @code{"foo"} and @code{"bar"}.

In Unix systems you can define @code{main} a third way, using three arguments:

@smallexample
int main (int @var{argc}, char *@var{argv}[], char *@var{envp}[])
@end smallexample

The first two arguments are just the same.  The third argument
@var{envp} gives the program's environment; it is the same as the value
of @code{environ}.  @xref{Environment Variables}.  POSIX.1 does not
allow this three-argument form, so to be portable it is best to write
@code{main} to take two arguments, and use the value of @code{environ}.

@menu
* Argument Syntax::             By convention, options start with a hyphen.
* Parsing Program Arguments::   Ways to parse program options and arguments.
@end menu

@node Argument Syntax, Parsing Program Arguments, , Program Arguments
@subsection Program Argument Syntax Conventions
@cindex program argument syntax
@cindex syntax, for program arguments
@cindex command argument syntax

POSIX recommends these conventions for command line arguments.
@code{getopt} (@pxref{Getopt}) and @code{argp_parse} (@pxref{Argp}) make
it easy to implement them.

@itemize @bullet
@item
Arguments are options if they begin with a hyphen delimiter (@samp{-}).

@item
Multiple options may follow a hyphen delimiter in a single token if
the options do not take arguments.  Thus, @samp{-abc} is equivalent to
@samp{-a -b -c}.

@item
Option names are single alphanumeric characters (as for @code{isalnum};
@pxref{Classification of Characters}).

@item
Certain options require an argument.  For example, the @samp{-o} command
of the @code{ld} command requires an argument---an output file name.

@item
An option and its argument may or may not appear as separate tokens.  (In
other words, the whitespace separating them is optional.)  Thus,
@w{@samp{-o foo}} and @samp{-ofoo} are equivalent.

@item
Options typically precede other non-option arguments.

The implementations of @code{getopt} and @code{argp_parse} in @theglibc{}
normally make it appear as if all the option arguments were
specified before all the non-option arguments for the purposes of
parsing, even if the user of your program intermixed option and
non-option arguments.  They do this by reordering the elements of the
@var{argv} array.  This behavior is nonstandard; if you want to suppress
it, define the @code{_POSIX_OPTION_ORDER} environment variable.
@xref{Standard Environment}.

@item
The argument @samp{--} terminates all options; any following arguments
are treated as non-option arguments, even if they begin with a hyphen.

@item
A token consisting of a single hyphen character is interpreted as an
ordinary non-option argument.  By convention, it is used to specify
input from or output to the standard input and output streams.

@item
Options may be supplied in any order, or appear multiple times.  The
interpretation is left up to the particular application program.
@end itemize

@cindex long-named options
GNU adds @dfn{long options} to these conventions.  Long options consist
of @samp{--} followed by a name made of alphanumeric characters and
dashes.  Option names are typically one to three words long, with
hyphens to separate words.  Users can abbreviate the option names as
long as the abbreviations are unique.

To specify an argument for a long option, write
@samp{--@var{name}=@var{value}}.  This syntax enables a long option to
accept an argument that is itself optional.

Eventually, @gnusystems{} will provide completion for long option names
in the shell.

@node Parsing Program Arguments, , Argument Syntax, Program Arguments
@subsection Parsing Program Arguments

@cindex program arguments, parsing
@cindex command arguments, parsing
@cindex parsing program arguments
If the syntax for the command line arguments to your program is simple
enough, you can simply pick the arguments off from @var{argv} by hand.
But unless your program takes a fixed number of arguments, or all of the
arguments are interpreted in the same way (as file names, for example),
you are usually better off using @code{getopt} (@pxref{Getopt}) or
@code{argp_parse} (@pxref{Argp}) to do the parsing.

@code{getopt} is more standard (the short-option only version of it is a
part of the POSIX standard), but using @code{argp_parse} is often
easier, both for very simple and very complex option structures, because
it does more of the dirty work for you.

@menu
* Getopt::                      Parsing program options using @code{getopt}.
* Argp::                        Parsing program options using @code{argp_parse}.
* Suboptions::                  Some programs need more detailed options.
* Suboptions Example::          This shows how it could be done for @code{mount}.
@end menu

@c Getopt and argp start at the @section level so that there's
@c enough room for their internal hierarchy (mostly a problem with
@c argp).         -Miles

@include getopt.texi
@include argp.texi

@node Suboptions, Suboptions Example, Argp, Parsing Program Arguments
@c This is a @section so that it's at the same level as getopt and argp
@subsubsection Parsing of Suboptions

Having a single level of options is sometimes not enough.  There might
be too many options which have to be available or a set of options is
closely related.

For this case some programs use suboptions.  One of the most prominent
programs is certainly @code{mount}(8).  The @code{-o} option take one
argument which itself is a comma separated list of options.  To ease the
programming of code like this the function @code{getsubopt} is
available.

@comment stdlib.h
@deftypefun int getsubopt (char **@var{optionp}, char *const *@var{tokens}, char **@var{valuep})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c getsubopt ok
@c  strchrnul dup ok
@c  memchr dup ok
@c  strncmp dup ok

The @var{optionp} parameter must be a pointer to a variable containing
the address of the string to process.  When the function returns the
reference is updated to point to the next suboption or to the
terminating @samp{\0} character if there is no more suboption available.

The @var{tokens} parameter references an array of strings containing the
known suboptions.  All strings must be @samp{\0} terminated and to mark
the end a null pointer must be stored.  When @code{getsubopt} finds a
possible legal suboption it compares it with all strings available in
the @var{tokens} array and returns the index in the string as the
indicator.

In case the suboption has an associated value introduced by a @samp{=}
character, a pointer to the value is returned in @var{valuep}.  The
string is @samp{\0} terminated.  If no argument is available
@var{valuep} is set to the null pointer.  By doing this the caller can
check whether a necessary value is given or whether no unexpected value
is present.

In case the next suboption in the string is not mentioned in the
@var{tokens} array the starting address of the suboption including a
possible value is returned in @var{valuep} and the return value of the
function is @samp{-1}.
@end deftypefun

@node Suboptions Example, , Suboptions, Parsing Program Arguments
@subsection Parsing of Suboptions Example

The code which might appear in the @code{mount}(8) program is a perfect
example of the use of @code{getsubopt}:

@smallexample
@include subopt.c.texi
@end smallexample


@node Environment Variables, Auxiliary Vector, Program Arguments, Program Basics
@section Environment Variables

@cindex environment variable
When a program is executed, it receives information about the context in
which it was invoked in two ways.  The first mechanism uses the
@var{argv} and @var{argc} arguments to its @code{main} function, and is
discussed in @ref{Program Arguments}.  The second mechanism uses
@dfn{environment variables} and is discussed in this section.

The @var{argv} mechanism is typically used to pass command-line
arguments specific to the particular program being invoked.  The
environment, on the other hand, keeps track of information that is
shared by many programs, changes infrequently, and that is less
frequently used.

The environment variables discussed in this section are the same
environment variables that you set using assignments and the
@code{export} command in the shell.  Programs executed from the shell
inherit all of the environment variables from the shell.
@c !!! xref to right part of bash manual when it exists

@cindex environment
Standard environment variables are used for information about the user's
home directory, terminal type, current locale, and so on; you can define
additional variables for other purposes.  The set of all environment
variables that have values is collectively known as the
@dfn{environment}.

Names of environment variables are case-sensitive and must not contain
the character @samp{=}.  System-defined environment variables are
invariably uppercase.

The values of environment variables can be anything that can be
represented as a string.  A value must not contain an embedded null
character, since this is assumed to terminate the string.


@menu
* Environment Access::          How to get and set the values of
				 environment variables.
* Standard Environment::        These environment variables have
                		 standard interpretations.
@end menu

@node Environment Access
@subsection Environment Access
@cindex environment access
@cindex environment representation

The value of an environment variable can be accessed with the
@code{getenv} function.  This is declared in the header file
@file{stdlib.h}.
@pindex stdlib.h

Libraries should use @code{secure_getenv} instead of @code{getenv}, so
that they do not accidentally use untrusted environment variables.
Modifications of environment variables are not allowed in
multi-threaded programs.  The @code{getenv} and @code{secure_getenv}
functions can be safely used in multi-threaded programs.

@comment stdlib.h
@comment ISO
@deftypefun {char *} getenv (const char *@var{name})
@safety{@prelim{}@mtsafe{@mtsenv{}}@assafe{}@acsafe{}}
@c Unguarded access to __environ.
This function returns a string that is the value of the environment
variable @var{name}.  You must not modify this string.  In some non-Unix
systems not using @theglibc{}, it might be overwritten by subsequent
calls to @code{getenv} (but not by any other library function).  If the
environment variable @var{name} is not defined, the value is a null
pointer.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun {char *} secure_getenv (const char *@var{name})
@safety{@prelim{}@mtsafe{@mtsenv{}}@assafe{}@acsafe{}}
@c Calls getenv unless secure mode is enabled.
This function is similar to @code{getenv}, but it returns a null
pointer if the environment is untrusted.  This happens when the
program file has SUID or SGID bits set.  General-purpose libraries
should always prefer this function over @code{getenv} to avoid
vulnerabilities if the library is referenced from a SUID/SGID program.

This function is a GNU extension.
@end deftypefun


@comment stdlib.h
@comment SVID
@deftypefun int putenv (char *@var{string})
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c putenv @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem
@c  strchr dup ok
@c  strndup dup @ascuheap @acsmem
@c  add_to_environ dup @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem
@c  free dup @ascuheap @acsmem
@c  unsetenv dup @mtasuconst:@mtsenv @asulock @aculock
The @code{putenv} function adds or removes definitions from the environment.
If the @var{string} is of the form @samp{@var{name}=@var{value}}, the
definition is added to the environment.  Otherwise, the @var{string} is
interpreted as the name of an environment variable, and any definition
for this variable in the environment is removed.

If the function is successful it returns @code{0}.  Otherwise the return
value is nonzero and @code{errno} is set to indicate the error.

The difference to the @code{setenv} function is that the exact string
given as the parameter @var{string} is put into the environment.  If the
user should change the string after the @code{putenv} call this will
reflect automatically in the environment.  This also requires that
@var{string} not be an automatic variable whose scope is left before the
variable is removed from the environment.  The same applies of course to
dynamically allocated variables which are freed later.

This function is part of the extended Unix interface.  Since it was also
available in old SVID libraries you should define either
@var{_XOPEN_SOURCE} or @var{_SVID_SOURCE} before including any header.
@end deftypefun


@comment stdlib.h
@comment BSD
@deftypefun int setenv (const char *@var{name}, const char *@var{value}, int @var{replace})
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c setenv @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem
@c  add_to_environ @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem
@c   strlen dup ok
@c   libc_lock_lock @asulock @aculock
@c   strncmp dup ok
@c   realloc dup @ascuheap @acsmem
@c   libc_lock_unlock @aculock
@c   malloc dup @ascuheap @acsmem
@c   free dup @ascuheap @acsmem
@c   mempcpy dup ok
@c   memcpy dup ok
@c   KNOWN_VALUE ok
@c    tfind(strcmp) [no @mtsrace guarded access]
@c     strcmp dup ok
@c   STORE_VALUE @ascuheap @acucorrupt @acsmem
@c    tsearch(strcmp) @ascuheap @acucorrupt @acsmem [no @mtsrace or @asucorrupt guarded access makes for mtsafe and @asulock]
@c     strcmp dup ok
The @code{setenv} function can be used to add a new definition to the
environment.  The entry with the name @var{name} is replaced by the
value @samp{@var{name}=@var{value}}.  Please note that this is also true
if @var{value} is the empty string.  To do this a new string is created
and the strings @var{name} and @var{value} are copied.  A null pointer
for the @var{value} parameter is illegal.  If the environment already
contains an entry with key @var{name} the @var{replace} parameter
controls the action.  If replace is zero, nothing happens.  Otherwise
the old entry is replaced by the new one.

Please note that you cannot remove an entry completely using this function.

If the function is successful it returns @code{0}.  Otherwise the
environment is unchanged and the return value is @code{-1} and
@code{errno} is set.

This function was originally part of the BSD library but is now part of
the Unix standard.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun int unsetenv (const char *@var{name})
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c unsetenv @mtasuconst:@mtsenv @asulock @aculock
@c  strchr dup ok
@c  strlen dup ok
@c  libc_lock_lock @asulock @aculock
@c  strncmp dup ok
@c  libc_lock_unlock @aculock
Using this function one can remove an entry completely from the
environment.  If the environment contains an entry with the key
@var{name} this whole entry is removed.  A call to this function is
equivalent to a call to @code{putenv} when the @var{value} part of the
string is empty.

The function return @code{-1} if @var{name} is a null pointer, points to
an empty string, or points to a string containing a @code{=} character.
It returns @code{0} if the call succeeded.

This function was originally part of the BSD library but is now part of
the Unix standard.  The BSD version had no return value, though.
@end deftypefun

There is one more function to modify the whole environment.  This
function is said to be used in the POSIX.9 (POSIX bindings for Fortran
77) and so one should expect it did made it into POSIX.1.  But this
never happened.  But we still provide this function as a GNU extension
to enable writing standard compliant Fortran environments.

@comment stdlib.h
@comment GNU
@deftypefun int clearenv (void)
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtsenv{}}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}}
@c clearenv @mtasuconst:@mtsenv @ascuheap @asulock @aculock @acsmem
@c  libc_lock_lock @asulock @aculock
@c  free dup @ascuheap @acsmem
@c  libc_lock_unlock @aculock
The @code{clearenv} function removes all entries from the environment.
Using @code{putenv} and @code{setenv} new entries can be added again
later.

If the function is successful it returns @code{0}.  Otherwise the return
value is nonzero.
@end deftypefun


You can deal directly with the underlying representation of environment
objects to add more variables to the environment (for example, to
communicate with another program you are about to execute;
@pxref{Executing a File}).

@comment unistd.h
@comment POSIX.1
@deftypevar {char **} environ
The environment is represented as an array of strings.  Each string is
of the format @samp{@var{name}=@var{value}}.  The order in which
strings appear in the environment is not significant, but the same
@var{name} must not appear more than once.  The last element of the
array is a null pointer.

This variable is declared in the header file @file{unistd.h}.

If you just want to get the value of an environment variable, use
@code{getenv}.
@end deftypevar

Unix systems, and @gnusystems{}, pass the initial value of
@code{environ} as the third argument to @code{main}.
@xref{Program Arguments}.

@node Standard Environment
@subsection Standard Environment Variables
@cindex standard environment variables

These environment variables have standard meanings.  This doesn't mean
that they are always present in the environment; but if these variables
@emph{are} present, they have these meanings.  You shouldn't try to use
these environment variable names for some other purpose.

@comment Extra blank lines make it look better.
@table @code
@item HOME
@cindex @code{HOME} environment variable
@cindex home directory

This is a string representing the user's @dfn{home directory}, or
initial default working directory.

The user can set @code{HOME} to any value.
If you need to make sure to obtain the proper home directory
for a particular user, you should not use @code{HOME}; instead,
look up the user's name in the user database (@pxref{User Database}).

For most purposes, it is better to use @code{HOME}, precisely because
this lets the user specify the value.

@c !!! also USER
@item LOGNAME
@cindex @code{LOGNAME} environment variable

This is the name that the user used to log in.  Since the value in the
environment can be tweaked arbitrarily, this is not a reliable way to
identify the user who is running a program; a function like
@code{getlogin} (@pxref{Who Logged In}) is better for that purpose.

For most purposes, it is better to use @code{LOGNAME}, precisely because
this lets the user specify the value.

@item PATH
@cindex @code{PATH} environment variable

A @dfn{path} is a sequence of directory names which is used for
searching for a file.  The variable @code{PATH} holds a path used
for searching for programs to be run.

The @code{execlp} and @code{execvp} functions (@pxref{Executing a File})
use this environment variable, as do many shells and other utilities
which are implemented in terms of those functions.

The syntax of a path is a sequence of directory names separated by
colons.  An empty string instead of a directory name stands for the
current directory (@pxref{Working Directory}).

A typical value for this environment variable might be a string like:

@smallexample
:/bin:/etc:/usr/bin:/usr/new/X11:/usr/new:/usr/local/bin
@end smallexample

This means that if the user tries to execute a program named @code{foo},
the system will look for files named @file{foo}, @file{/bin/foo},
@file{/etc/foo}, and so on.  The first of these files that exists is
the one that is executed.

@c !!! also TERMCAP
@item TERM
@cindex @code{TERM} environment variable

This specifies the kind of terminal that is receiving program output.
Some programs can make use of this information to take advantage of
special escape sequences or terminal modes supported by particular kinds
of terminals.  Many programs which use the termcap library
(@pxref{Finding a Terminal Description,Find,,termcap,The Termcap Library
Manual}) use the @code{TERM} environment variable, for example.

@item TZ
@cindex @code{TZ} environment variable

This specifies the time zone.  @xref{TZ Variable}, for information about
the format of this string and how it is used.

@item LANG
@cindex @code{LANG} environment variable

This specifies the default locale to use for attribute categories where
neither @code{LC_ALL} nor the specific environment variable for that
category is set.  @xref{Locales}, for more information about
locales.

@ignore
@c I doubt this really exists
@item LC_ALL
@cindex @code{LC_ALL} environment variable

This is similar to the @code{LANG} environment variable.  However, its
value takes precedence over any values provided for the individual
attribute category environment variables, or for the @code{LANG}
environment variable.
@end ignore

@item LC_ALL
@cindex @code{LC_ALL} environment variable

If this environment variable is set it overrides the selection for all
the locales done using the other @code{LC_*} environment variables.  The
value of the other @code{LC_*} environment variables is simply ignored
in this case.

@item LC_COLLATE
@cindex @code{LC_COLLATE} environment variable

This specifies what locale to use for string sorting.

@item LC_CTYPE
@cindex @code{LC_CTYPE} environment variable

This specifies what locale to use for character sets and character
classification.

@item LC_MESSAGES
@cindex @code{LC_MESSAGES} environment variable

This specifies what locale to use for printing messages and to parse
responses.

@item LC_MONETARY
@cindex @code{LC_MONETARY} environment variable

This specifies what locale to use for formatting monetary values.

@item LC_NUMERIC
@cindex @code{LC_NUMERIC} environment variable

This specifies what locale to use for formatting numbers.

@item LC_TIME
@cindex @code{LC_TIME} environment variable

This specifies what locale to use for formatting date/time values.

@item NLSPATH
@cindex @code{NLSPATH} environment variable

This specifies the directories in which the @code{catopen} function
looks for message translation catalogs.

@item _POSIX_OPTION_ORDER
@cindex @code{_POSIX_OPTION_ORDER} environment variable.

If this environment variable is defined, it suppresses the usual
reordering of command line arguments by @code{getopt} and
@code{argp_parse}.  @xref{Argument Syntax}.

@c !!! GNU also has COREFILE, CORESERVER, EXECSERVERS
@end table

@node Auxiliary Vector
@section Auxiliary Vector
@cindex auxiliary vector

When a program is executed, it receives information from the operating
system about the environment in which it is operating.  The form of this
information is a table of key-value pairs, where the keys are from the
set of @samp{AT_} values in @file{elf.h}.  Some of the data is provided
by the kernel for libc consumption, and may be obtained by ordinary
interfaces, such as @code{sysconf}.  However, on a platform-by-platform
basis there may be information that is not available any other way.

@subsection Definition of @code{getauxval}
@comment sys/auxv.h
@deftypefun {unsigned long int} getauxval (unsigned long int @var{type})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Reads from hwcap or iterates over constant auxv.
This function is used to inquire about the entries in the auxiliary
vector.  The @var{type} argument should be one of the @samp{AT_} symbols
defined in @file{elf.h}.  If a matching entry is found, the value is
returned; if the entry is not found, zero is returned and @code{errno} is
set to @code{ENOENT}.
@end deftypefun

For some platforms, the key @code{AT_HWCAP} is the easiest way to inquire
about any instruction set extensions available at runtime.  In this case,
there will (of necessity) be a platform-specific set of @samp{HWCAP_}
values masked together that describe the capabilities of the cpu on which
the program is being executed.

@node System Calls
@section System Calls

@cindex system call
A system call is a request for service that a program makes of the
kernel.  The service is generally something that only the kernel has
the privilege to do, such as doing I/O.  Programmers don't normally
need to be concerned with system calls because there are functions in
@theglibc{} to do virtually everything that system calls do.
These functions work by making system calls themselves.  For example,
there is a system call that changes the permissions of a file, but
you don't need to know about it because you can just use @theglibc{}'s
@code{chmod} function.

@cindex kernel call
System calls are sometimes called kernel calls.

However, there are times when you want to make a system call explicitly,
and for that, @theglibc{} provides the @code{syscall} function.
@code{syscall} is harder to use and less portable than functions like
@code{chmod}, but easier and more portable than coding the system call
in assembler instructions.

@code{syscall} is most useful when you are working with a system call
which is special to your system or is newer than @theglibc{} you
are using.  @code{syscall} is implemented in an entirely generic way;
the function does not know anything about what a particular system
call does or even if it is valid.

The description of @code{syscall} in this section assumes a certain
protocol for system calls on the various platforms on which @theglibc{}
runs.  That protocol is not defined by any strong authority, but
we won't describe it here either because anyone who is coding
@code{syscall} probably won't accept anything less than kernel and C
library source code as a specification of the interface between them
anyway.


@code{syscall} is declared in @file{unistd.h}.

@comment unistd.h
@comment ???
@deftypefun {long int} syscall (long int @var{sysno}, @dots{})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}

@code{syscall} performs a generic system call.

@cindex system call number
@var{sysno} is the system call number.  Each kind of system call is
identified by a number.  Macros for all the possible system call numbers
are defined in @file{sys/syscall.h}

The remaining arguments are the arguments for the system call, in
order, and their meanings depend on the kind of system call.  Each kind
of system call has a definite number of arguments, from zero to five.
If you code more arguments than the system call takes, the extra ones to
the right are ignored.

The return value is the return value from the system call, unless the
system call failed.  In that case, @code{syscall} returns @code{-1} and
sets @code{errno} to an error code that the system call returned.  Note
that system calls do not return @code{-1} when they succeed.
@cindex errno

If you specify an invalid @var{sysno}, @code{syscall} returns @code{-1}
with @code{errno} = @code{ENOSYS}.

Example:

@smallexample

#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>

@dots{}

int rc;

rc = syscall(SYS_chmod, "/etc/passwd", 0444);

if (rc == -1)
   fprintf(stderr, "chmod failed, errno = %d\n", errno);

@end smallexample

This, if all the compatibility stars are aligned, is equivalent to the
following preferable code:

@smallexample

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>

@dots{}

int rc;

rc = chmod("/etc/passwd", 0444);
if (rc == -1)
   fprintf(stderr, "chmod failed, errno = %d\n", errno);

@end smallexample

@end deftypefun


@node Program Termination
@section Program Termination
@cindex program termination
@cindex process termination

@cindex exit status value
The usual way for a program to terminate is simply for its @code{main}
function to return.  The @dfn{exit status value} returned from the
@code{main} function is used to report information back to the process's
parent process or shell.

A program can also terminate normally by calling the @code{exit}
function.

In addition, programs can be terminated by signals; this is discussed in
more detail in @ref{Signal Handling}.  The @code{abort} function causes
a signal that kills the program.

@menu
* Normal Termination::          If a program calls @code{exit}, a
                                 process terminates normally.
* Exit Status::                 The @code{exit status} provides information
                                 about why the process terminated.
* Cleanups on Exit::            A process can run its own cleanup
                                 functions upon normal termination.
* Aborting a Program::          The @code{abort} function causes
                                 abnormal program termination.
* Termination Internals::       What happens when a process terminates.
@end menu

@node Normal Termination
@subsection Normal Termination

A process terminates normally when its program signals it is done by
calling @code{exit}.  Returning from @code{main} is equivalent to
calling @code{exit}, and the value that @code{main} returns is used as
the argument to @code{exit}.

@comment stdlib.h
@comment ISO
@deftypefun void exit (int @var{status})
@safety{@prelim{}@mtunsafe{@mtasurace{:exit}}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}}
@c Access to the atexit/on_exit list, the libc_atexit hook and tls dtors
@c is not guarded.  Streams must be flushed, and that triggers the usual
@c AS and AC issues with streams.
The @code{exit} function tells the system that the program is done, which
causes it to terminate the process.

@var{status} is the program's exit status, which becomes part of the
process' termination status.  This function does not return.
@end deftypefun

Normal termination causes the following actions:

@enumerate
@item
Functions that were registered with the @code{atexit} or @code{on_exit}
functions are called in the reverse order of their registration.  This
mechanism allows your application to specify its own ``cleanup'' actions
to be performed at program termination.  Typically, this is used to do
things like saving program state information in a file, or unlocking
locks in shared data bases.

@item
All open streams are closed, writing out any buffered output data.  See
@ref{Closing Streams}.  In addition, temporary files opened
with the @code{tmpfile} function are removed; see @ref{Temporary Files}.

@item
@code{_exit} is called, terminating the program.  @xref{Termination Internals}.
@end enumerate

@node Exit Status
@subsection Exit Status
@cindex exit status

When a program exits, it can return to the parent process a small
amount of information about the cause of termination, using the
@dfn{exit status}.  This is a value between 0 and 255 that the exiting
process passes as an argument to @code{exit}.

Normally you should use the exit status to report very broad information
about success or failure.  You can't provide a lot of detail about the
reasons for the failure, and most parent processes would not want much
detail anyway.

There are conventions for what sorts of status values certain programs
should return.  The most common convention is simply 0 for success and 1
for failure.  Programs that perform comparison use a different
convention: they use status 1 to indicate a mismatch, and status 2 to
indicate an inability to compare.  Your program should follow an
existing convention if an existing convention makes sense for it.

A general convention reserves status values 128 and up for special
purposes.  In particular, the value 128 is used to indicate failure to
execute another program in a subprocess.  This convention is not
universally obeyed, but it is a good idea to follow it in your programs.

@strong{Warning:} Don't try to use the number of errors as the exit
status.  This is actually not very useful; a parent process would
generally not care how many errors occurred.  Worse than that, it does
not work, because the status value is truncated to eight bits.
Thus, if the program tried to report 256 errors, the parent would
receive a report of 0 errors---that is, success.

For the same reason, it does not work to use the value of @code{errno}
as the exit status---these can exceed 255.

@strong{Portability note:} Some non-POSIX systems use different
conventions for exit status values.  For greater portability, you can
use the macros @code{EXIT_SUCCESS} and @code{EXIT_FAILURE} for the
conventional status value for success and failure, respectively.  They
are declared in the file @file{stdlib.h}.
@pindex stdlib.h

@comment stdlib.h
@comment ISO
@deftypevr Macro int EXIT_SUCCESS
This macro can be used with the @code{exit} function to indicate
successful program completion.

On POSIX systems, the value of this macro is @code{0}.  On other
systems, the value might be some other (possibly non-constant) integer
expression.
@end deftypevr

@comment stdlib.h
@comment ISO
@deftypevr Macro int EXIT_FAILURE
This macro can be used with the @code{exit} function to indicate
unsuccessful program completion in a general sense.

On POSIX systems, the value of this macro is @code{1}.  On other
systems, the value might be some other (possibly non-constant) integer
expression.  Other nonzero status values also indicate failures.  Certain
programs use different nonzero status values to indicate particular
kinds of "non-success".  For example, @code{diff} uses status value
@code{1} to mean that the files are different, and @code{2} or more to
mean that there was difficulty in opening the files.
@end deftypevr

Don't confuse a program's exit status with a process' termination status.
There are lots of ways a process can terminate besides having its program
finish.  In the event that the process termination @emph{is} caused by program
termination (i.e., @code{exit}), though, the program's exit status becomes
part of the process' termination status.

@node Cleanups on Exit
@subsection Cleanups on Exit

Your program can arrange to run its own cleanup functions if normal
termination happens.  If you are writing a library for use in various
application programs, then it is unreliable to insist that all
applications call the library's cleanup functions explicitly before
exiting.  It is much more robust to make the cleanup invisible to the
application, by setting up a cleanup function in the library itself
using @code{atexit} or @code{on_exit}.

@comment stdlib.h
@comment ISO
@deftypefun int atexit (void (*@var{function}) (void))
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}}
@c atexit @ascuheap @asulock @aculock @acsmem
@c  cxa_atexit @ascuheap @asulock @aculock @acsmem
@c   __internal_atexit @ascuheap @asulock @aculock @acsmem
@c    __new_exitfn @ascuheap @asulock @aculock @acsmem
@c     __libc_lock_lock @asulock @aculock
@c     calloc dup @ascuheap @acsmem
@c     __libc_lock_unlock @aculock
@c    atomic_write_barrier dup ok
The @code{atexit} function registers the function @var{function} to be
called at normal program termination.  The @var{function} is called with
no arguments.

The return value from @code{atexit} is zero on success and nonzero if
the function cannot be registered.
@end deftypefun

@comment stdlib.h
@comment SunOS
@deftypefun int on_exit (void (*@var{function})(int @var{status}, void *@var{arg}), void *@var{arg})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{}}}
@c on_exit @ascuheap @asulock @aculock @acsmem
@c  new_exitfn dup @ascuheap @asulock @aculock @acsmem
@c  atomic_write_barrier dup ok
This function is a somewhat more powerful variant of @code{atexit}.  It
accepts two arguments, a function @var{function} and an arbitrary
pointer @var{arg}.  At normal program termination, the @var{function} is
called with two arguments:  the @var{status} value passed to @code{exit},
and the @var{arg}.

This function is included in @theglibc{} only for compatibility
for SunOS, and may not be supported by other implementations.
@end deftypefun

Here's a trivial program that illustrates the use of @code{exit} and
@code{atexit}:

@smallexample
@include atexit.c.texi
@end smallexample

@noindent
When this program is executed, it just prints the message and exits.

@node Aborting a Program
@subsection Aborting a Program
@cindex aborting a program

You can abort your program using the @code{abort} function.  The prototype
for this function is in @file{stdlib.h}.
@pindex stdlib.h

@comment stdlib.h
@comment ISO
@deftypefun void abort (void)
@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}}
@c The implementation takes a recursive lock and attempts to support
@c calls from signal handlers, but if we're in the middle of flushing or
@c using streams, we may encounter them in inconsistent states.
The @code{abort} function causes abnormal program termination.  This
does not execute cleanup functions registered with @code{atexit} or
@code{on_exit}.

This function actually terminates the process by raising a
@code{SIGABRT} signal, and your program can include a handler to
intercept this signal; see @ref{Signal Handling}.
@end deftypefun

@c Put in by rms.  Don't remove.
@cartouche
@strong{Future Change Warning:} Proposed Federal censorship regulations
may prohibit us from giving you information about the possibility of
calling this function.  We would be required to say that this is not an
acceptable way of terminating a program.
@end cartouche

@node Termination Internals
@subsection Termination Internals

The @code{_exit} function is the primitive used for process termination
by @code{exit}.  It is declared in the header file @file{unistd.h}.
@pindex unistd.h

@comment unistd.h
@comment POSIX.1
@deftypefun void _exit (int @var{status})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Direct syscall (exit_group or exit); calls __task_terminate on hurd,
@c and abort in the generic posix implementation.
The @code{_exit} function is the primitive for causing a process to
terminate with status @var{status}.  Calling this function does not
execute cleanup functions registered with @code{atexit} or
@code{on_exit}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun void _Exit (int @var{status})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Alias for _exit.
The @code{_Exit} function is the @w{ISO C} equivalent to @code{_exit}.
The @w{ISO C} committee members were not sure whether the definitions of
@code{_exit} and @code{_Exit} were compatible so they have not used the
POSIX name.

This function was introduced in @w{ISO C99} and is declared in
@file{stdlib.h}.
@end deftypefun

When a process terminates for any reason---either because the program
terminates, or as a result of a signal---the
following things happen:

@itemize @bullet
@item
All open file descriptors in the process are closed.  @xref{Low-Level I/O}.
Note that streams are not flushed automatically when the process
terminates; see @ref{I/O on Streams}.

@item
A process exit status is saved to be reported back to the parent process
via @code{wait} or @code{waitpid}; see @ref{Process Completion}.  If the
program exited, this status includes as its low-order 8 bits the program
exit status.


@item
Any child processes of the process being terminated are assigned a new
parent process.  (On most systems, including GNU, this is the @code{init}
process, with process ID 1.)

@item
A @code{SIGCHLD} signal is sent to the parent process.

@item
If the process is a session leader that has a controlling terminal, then
a @code{SIGHUP} signal is sent to each process in the foreground job,
and the controlling terminal is disassociated from that session.
@xref{Job Control}.

@item
If termination of a process causes a process group to become orphaned,
and any member of that process group is stopped, then a @code{SIGHUP}
signal and a @code{SIGCONT} signal are sent to each process in the
group.  @xref{Job Control}.
@end itemize
