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

NAME

       getenv - get value of an environment variable

SYNOPSIS

       #include <stdlib.h>

       char *getenv(const char *name);

DESCRIPTION

       The  getenv()  function  shall search the environment of the calling process (see the Base
       Definitions volume of IEEE Std 1003.1-2001, Chapter  8,  Environment  Variables)  for  the
       environment  variable  name  if  it  exists  and  return  a  pointer  to  the value of the
       environment variable. If the specified  environment  variable  cannot  be  found,  a  null
       pointer shall be returned. The application shall ensure that it does not modify the string
       pointed to by the getenv() function.

       The string pointed to may be overwritten by a subsequent call to  getenv(),  setenv(),  or
       unsetenv(),   but  shall not be overwritten by a call to any other function in this volume
       of IEEE Std 1003.1-2001.

       If the application modifies environ or the pointers to which it points,  the  behavior  of
       getenv() is undefined.

       The  getenv()  function  need  not  be  reentrant.  A  function that is not required to be
       reentrant is not required to be thread-safe.

RETURN VALUE

       Upon successful completion, getenv() shall return a pointer to  a  string  containing  the
       value  for the specified name. If the specified name cannot be found in the environment of
       the calling process, a null pointer shall be returned.

       The return value from getenv() may point to  static  data  which  may  be  overwritten  by
       subsequent calls to getenv(), setenv(), or unsetenv().

       On  XSI-conformant  systems, the return value from getenv() may point to static data which
       may also be overwritten by subsequent calls to putenv().

ERRORS

       No errors are defined.

       The following sections are informative.

EXAMPLES

   Getting the Value of an Environment Variable
       The following example gets the value of the HOME environment variable.

              #include <stdlib.h>
              ...
              const char *name = "HOME";
              char *value;

              value = getenv(name);

APPLICATION USAGE

       None.

RATIONALE

       The clearenv() function was considered but rejected. The putenv() function  has  now  been
       included for alignment with the Single UNIX Specification.

       The  getenv()  function is inherently not reentrant because it returns a value pointing to
       static data.

       Conforming applications are required not to modify environ directly, but to use  only  the
       functions  described  here  to  manipulate  the process environment as an abstract object.
       Thus, the implementation of the environment access functions has complete control over the
       data  structure used to represent the environment (subject to the requirement that environ
       be maintained as a list of strings with embedded equal signs for applications that wish to
       scan  the  environment).  This constraint allows the implementation to properly manage the
       memory it allocates, either by using allocated storage for all variables (copying them  on
       the  first  invocation  of  setenv() or unsetenv()), or keeping track of which strings are
       currently in allocated space and which are not, via a separate table or some other  means.
       This  enables  the implementation to free any allocated space used by strings (and perhaps
       the pointers to them) stored in environ when unsetenv() is called. A  C  runtime  start-up
       procedure  (that which invokes main() and perhaps initializes environ) can also initialize
       a flag indicating that none of the environment has yet been copied to  allocated  storage,
       or that the separate table has not yet been initialized.

       In  fact,  for  higher  performance  of getenv(), the implementation could also maintain a
       separate copy of the environment in a data structure that  could  be  searched  much  more
       quickly  (such  as  an  indexed  hash table, or a binary tree), and update both it and the
       linear list at environ when setenv() or unsetenv() is invoked.

       Performance of getenv() can be important for applications  which  have  large  numbers  of
       environment variables. Typically, applications like this use the environment as a resource
       database of user-configurable parameters. The fact that these variables are in the  user's
       shell  environment  usually  means  that any other program that uses environment variables
       (such as ls, which attempts to use COLUMNS ), or really almost any utility ( LANG , LC_ALL
       , and so on) is similarly slowed down by the linear search through the variables.

       An  implementation  that  maintains separate data structures, or even one that manages the
       memory it consumes, is not currently required as it was thought it would reduce  consensus
       among implementors who do not want to change their historical implementations.

       The  POSIX  Threads  Extension  states  that  multi-threaded  applications must not modify
       environ  directly,  and  that  IEEE Std 1003.1-2001  is  providing  functions  which  such
       applications  can use in the future to manipulate the environment in a thread-safe manner.
       Thus, moving away from application use of environ is desirable  from  that  standpoint  as
       well.

FUTURE DIRECTIONS

       None.

SEE ALSO

       exec()   ,   putenv()   ,   setenv()  ,  unsetenv()  ,  the  Base  Definitions  volume  of
       IEEE Std 1003.1-2001, Chapter 8, Environment Variables, <stdlib.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 .