
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" type="text/css" href="../../../style.css" title="style" />
    <link rel="stylesheet" type="text/css" href="../style.css" title="style" />
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />

    <title>getcwd.3p - Linux manual page</title>
</head>

<body>

<div class="page-top"><a id="top_of_page"></a></div>
<!--%%%TOP_BAR%%%-->
    <div class="nav-bar">
        <table class="nav-table">
            <tr>
                <td class="nav-cell">
                    <p class="nav-text">
                        <a href="http://man7.org/index.html">man7.org</a> &gt; Linux &gt; <a href="../index.html">man-pages</a>
                    </p>
                </td>
                <td class="training-cell">
                    <p class="training-text"><a class="training-link" href="http://man7.org/training/">Linux/UNIX system programming training</a></p>
                </td>
            </tr>
        </table>
    </div>

<hr class="nav-end" />

<!--%%%PAGE_START%%%-->


<table class="sec-table">
<tr>
    <td>
        <p class="section-dir">
<a href="getcwd.3p.html#PROLOG">PROLOG</a> | <a href="getcwd.3p.html#NAME">NAME</a> | <a href="getcwd.3p.html#SYNOPSIS">SYNOPSIS</a> | <a href="getcwd.3p.html#DESCRIPTION">DESCRIPTION</a> | <a href="getcwd.3p.html#RETURN_VALUE">RETURN&nbsp;VALUE</a> | <a href="getcwd.3p.html#ERRORS">ERRORS</a> | <a href="getcwd.3p.html#EXAMPLES">EXAMPLES</a> | <a href="getcwd.3p.html#APPLICATION_USAGE">APPLICATION&nbsp;USAGE</a> | <a href="getcwd.3p.html#RATIONALE">RATIONALE</a> | <a href="getcwd.3p.html#FUTURE_DIRECTIONS">FUTURE&nbsp;DIRECTIONS</a> | <a href="getcwd.3p.html#SEE_ALSO">SEE&nbsp;ALSO</a> | <a href="getcwd.3p.html#COPYRIGHT">COPYRIGHT</a>
        </p>
    </td>
    <td class="search-box">
        <div class="man-search-box">

            <form method="get" action="http://www.google.com/search">
                <fieldset class="man-search">
                    <input type="text" name="q" size="10" maxlength="255" value="" />
                    <input type="hidden" name="sitesearch" value="man7.org/linux/man-pages" />
                    <input type="submit" name="sa" value="Search online pages" />
                </fieldset>
            </form>

        </div>
    </td>
    <td> </td>
</tr>
</table>

<pre>
<span class="headline">GETCWD(3P)                POSIX Programmer's Manual               GETCWD(3P)</span>
</pre>
<h2><a id="PROLOG" href="getcwd.3p.html#PROLOG"></a>PROLOG  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       This manual page is part of the POSIX Programmer's Manual.  The Linux
       implementation of this interface may differ (consult the
       corresponding Linux manual page for details of Linux behavior), or
       the interface may not be implemented on Linux.
</pre>
<h2><a id="NAME" href="getcwd.3p.html#NAME"></a>NAME  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       getcwd — get the pathname of the current working directory
</pre>
<h2><a id="SYNOPSIS" href="getcwd.3p.html#SYNOPSIS"></a>SYNOPSIS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       #include &lt;unistd.h&gt;

       char *getcwd(char *<i>buf</i>, size_t <i>size</i>);
</pre>
<h2><a id="DESCRIPTION" href="getcwd.3p.html#DESCRIPTION"></a>DESCRIPTION  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The <i>getcwd</i>() function shall place an absolute pathname of the current
       working directory in the array pointed to by <i>buf</i>, and return <i>buf</i>.
       The pathname shall contain no components that are dot or dot-dot, or
       are symbolic links.

       If there are multiple pathnames that <i>getcwd</i>() could place in the
       array pointed to by <i>buf</i>, one beginning with a single &lt;slash&gt;
       character and one or more beginning with two &lt;slash&gt; characters, then
       <i>getcwd</i>() shall place the pathname beginning with a single &lt;slash&gt;
       character in the array. The pathname shall not contain any
       unnecessary &lt;slash&gt; characters after the leading one or two &lt;slash&gt;
       characters.

       The <i>size</i> argument is the size in bytes of the character array pointed
       to by the <i>buf</i> argument. If <i>buf</i> is a null pointer, the behavior of
       <i>getcwd</i>() is unspecified.
</pre>
<h2><a id="RETURN_VALUE" href="getcwd.3p.html#RETURN_VALUE"></a>RETURN VALUE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Upon successful completion, <i>getcwd</i>() shall return the <i>buf</i> argument.
       Otherwise, <i>getcwd</i>() shall return a null pointer and set <i><a href="errno.3.html">errno</a></i> to
       indicate the error. The contents of the array pointed to by <i>buf</i> are
       then undefined.
</pre>
<h2><a id="ERRORS" href="getcwd.3p.html#ERRORS"></a>ERRORS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The <i>getcwd</i>() function shall fail if:

       <b>EINVAL </b>The <i>size</i> argument is 0.

       <b>ERANGE </b>The <i>size</i> argument is greater than 0, but is smaller than the
              length of the string +1.

       The <i>getcwd</i>() function may fail if:

       <b>EACCES </b>Search permission was denied for the current directory, or
              read or search permission was denied for a directory above the
              current directory in the file hierarchy.

       <b>ENOMEM </b>Insufficient storage space is available.

       <i>The following sections are informative.</i>
</pre>
<h2><a id="EXAMPLES" href="getcwd.3p.html#EXAMPLES"></a>EXAMPLES  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The following example uses {PATH_MAX} as the initial buffer size
       (unless it is indeterminate or very large), and calls <i>getcwd</i>() with
       progressively larger buffers until it does not give an <b>[ERANGE]</b>
       error.

           <b>#include &lt;stdlib.h&gt;</b>
           <b>#include &lt;errno.h&gt;</b>
           <b>#include &lt;unistd.h&gt;</b>

           ...

           long path_max;
           size_t size;
           char *buf;
           char *ptr;

           path_max = pathconf(".", _PC_PATH_MAX);
           if (path_max == -1)
               size = 1024;
           else if (path_max &gt; 10240)
               size = 10240;
           else
               size = path_max;

           for (buf = ptr = NULL; ptr == NULL; size *= 2)
           {
               if ((buf = realloc(buf, size)) == NULL)
               {
                   ... handle error ...
               }

               ptr = getcwd(buf, size);
               if (ptr == NULL &amp;&amp; errno != ERANGE)
               {
                   ... handle error ...
               }
           }
           ...
           free (buf);
</pre>
<h2><a id="APPLICATION_USAGE" href="getcwd.3p.html#APPLICATION_USAGE"></a>APPLICATION USAGE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       If the pathname obtained from <i>getcwd</i>() is longer than {PATH_MAX}
       bytes, it could produce an <b>[ENAMETOOLONG] </b>error if passed to <i>chdir</i>().
       Therefore, in order to return to that directory it may be necessary
       to break the pathname into sections shorter than {PATH_MAX} bytes and
       call <i>chdir</i>() on each section in turn (the first section being an
       absolute pathname and subsequent sections being relative pathnames).
       A simpler way to handle saving and restoring the working directory
       when it may be deeper than {PATH_MAX} bytes in the file hierarchy is
       to use a file descriptor and <i>fchdir</i>(), rather than <i>getcwd</i>() and
       <i>chdir</i>().  However, the two methods do have some differences. The
       <i>fchdir</i>() approach causes the program to restore a working directory
       even if it has been renamed in the meantime, whereas the <i>chdir</i>()
       approach restores to a directory with the same name as the original,
       even if the directories were renamed in the meantime. Since the
       <i>fchdir</i>() approach does not access parent directories, it can succeed
       when <i>getcwd</i>() would fail due to permissions problems. In applications
       conforming to earlier versions of this standard, it was not possible
       to use the <i>fchdir</i>() approach when the working directory is searchable
       but not readable, as the only way to open a directory was with
       O_RDONLY, whereas the <i>getcwd</i>() approach can succeed in this case.
</pre>
<h2><a id="RATIONALE" href="getcwd.3p.html#RATIONALE"></a>RATIONALE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Having <i>getcwd</i>() take no arguments and instead use the <i>malloc</i>()
       function to produce space for the returned argument was considered.
       The advantage is that <i>getcwd</i>() knows how big the working directory
       pathname is and can allocate an appropriate amount of space. But the
       programmer would have to use the <i>free</i>() function to free the
       resulting object, or each use of <i>getcwd</i>() would further reduce the
       available memory. Finally, <i>getcwd</i>() is taken from the SVID where it
       has the two arguments used in this volume of POSIX.1‐2008.

       The older function <i>getwd</i>() was rejected for use in this context
       because it had only a buffer argument and no <i>size</i> argument, and thus
       had no way to prevent overwriting the buffer, except to depend on the
       programmer to provide a large enough buffer.

       On some implementations, if <i>buf</i> is a null pointer, <i>getcwd</i>() may
       obtain <i>size</i> bytes of memory using <i>malloc</i>().  In this case, the
       pointer returned by <i>getcwd</i>() may be used as the argument in a
       subsequent call to <i>free</i>().  Invoking <i>getcwd</i>() with <i>buf</i> as a null
       pointer is not recommended in conforming applications.

       Earlier implementations of <i>getcwd</i>() sometimes generated pathnames
       like <b>"../../../subdirname" </b>internally, using them to explore the path
       of ancestor directories back to the root. If one of these internal
       pathnames exceeded {PATH_MAX} in length, the implementation could
       fail with <i><a href="errno.3.html">errno</a></i> set to <b>[ENAMETOOLONG]</b>.  This is no longer allowed.

       If a program is operating in a directory where some (grand)parent
       directory does not permit reading, <i>getcwd</i>() may fail, as in most
       implementations it must read the directory to determine the name of
       the file. This can occur if search, but not read, permission is
       granted in an intermediate directory, or if the program is placed in
       that directory by some more privileged process (for example, login).
       Including the <b>[EACCES] </b>error condition makes the reporting of the
       error consistent and warns the application developer that <i>getcwd</i>()
       can fail for reasons beyond the control of the application developer
       or user. Some implementations can avoid this occurrence (for example,
       by implementing <i>getcwd</i>() using <i>pwd</i>, where <i>pwd</i> is a set-user-root
       process), thus the error was made optional. Since this volume of
       POSIX.1‐2008 permits the addition of other errors, this would be a
       common addition and yet one that applications could not be expected
       to deal with without this addition.
</pre>
<h2><a id="FUTURE_DIRECTIONS" href="getcwd.3p.html#FUTURE_DIRECTIONS"></a>FUTURE DIRECTIONS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       None.
</pre>
<h2><a id="SEE_ALSO" href="getcwd.3p.html#SEE_ALSO"></a>SEE ALSO  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       <a href="malloc.3p.html">malloc(3p)</a>

       The Base Definitions volume of POSIX.1‐2008, <a href="../man0/unistd.h.0p.html">unistd.h(0p)</a>
</pre>
<h2><a id="COPYRIGHT" href="getcwd.3p.html#COPYRIGHT"></a>COPYRIGHT  &nbsp; &nbsp; &nbsp; &nbsp; <a href="getcwd.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Portions of this text are reprinted and reproduced in electronic form
       from IEEE Std 1003.1, 2013 Edition, Standard for Information
       Technology -- Portable Operating System Interface (POSIX), The Open
       Group Base Specifications Issue 7, Copyright (C) 2013 by the
       Institute of Electrical and Electronics Engineers, Inc and The Open
       Group.  (This is POSIX.1-2008 with the 2013 Technical Corrigendum 1
       applied.) 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 <a href="http://www.unix.org/online.html">http://www.unix.org/online.html</a> .

       Any typographical or formatting errors that appear in this page are
       most likely to have been introduced during the conversion of the
       source files to man page format. To report such errors, see
       <a href="https://www.kernel.org/doc/man-pages/reporting_bugs.html">https://www.kernel.org/doc/man-pages/reporting_bugs.html</a> .

<span class="footline">IEEE/The Open Group                 2013                          GETCWD(3P)</span>
</pre>

<hr class="end-man-text" />
<p>Pages that refer to this page: 
    <a href="../man0/unistd.h.0p.html">unistd.h(0p)</a>,&nbsp; 
    <a href="../man1/pwd.1p.html">pwd(1p)</a>,&nbsp; 
    <a href="chdir.3p.html">chdir(3p)</a>,&nbsp; 
    <a href="realpath.3p.html">realpath(3p)</a>
</p>
<hr/>

 
<hr class="start-footer" />

<div class="footer"> 

<table class="colophon-table">
    <tr>
    <td class="pub-info">
        <p>
            HTML rendering created 2018-02-02
            by <a href="http://man7.org/mtk/index.html">Michael Kerrisk</a>, 
            author of 
            <a href="http://man7.org/tlpi/"><em>The Linux Programming Interface</em></a>, 
            maintainer of the 
            <a href="https://www.kernel.org/doc/man-pages/">Linux <em>man-pages</em> project</a>.
        </p>
        <p>
            For details of in-depth
            <strong>Linux/UNIX system programming training courses</strong>
            that I teach, look <a href="http://man7.org/training/">here</a>.
        </p>
        <p>
            Hosting by <a href="http://www.jambit.com/index_en.html">jambit GmbH</a>.
        </p>
        <p>
            <a href="http://validator.w3.org/check?uri=referer">
            <img src="http://www.w3.org/Icons/valid-xhtml11"
                alt="Valid XHTML 1.1" height="31" width="88" />
            </a>
        </p>
    </td>
    <td class="colophon-divider">
    </td>
    <td class="tlpi-cover">
        <a href="http://man7.org/tlpi/"><img src="../../../tlpi/cover/TLPI-front-cover-vsmall.png" alt="Cover of TLPI" /></a>
    </td>
    </tr>
</table>

</div>

<hr class="end-footer" />



<!--BEGIN-SITETRACKING-->
<!-- SITETRACKING.man7.org_linux_man-pages -->

<!-- Start of StatCounter Code (xhtml) -->

<script type="text/javascript">
//<![CDATA[
var sc_project=7422636; 
var sc_invisible=1; 
var sc_security="9b6714ff"; 
//]]>
</script>
<script type="text/javascript"
src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="website
statistics" href="http://statcounter.com/"
class="statcounter"><img class="statcounter"
src="http://c.statcounter.com/7422636/0/9b6714ff/1/"
alt="website statistics" /></a></div></noscript>

<!-- End of StatCounter Code -->


<!-- Start of Google Analytics Code -->

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-9830363-8']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

<!-- End of Google Analytics Code -->

<!--END-SITETRACKING-->

</body>
</html>
