| <html lang="en"> |
| <head> |
| <title>Working Directory - The GNU C Library</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="The GNU C Library"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="File-System-Interface.html#File-System-Interface" title="File System Interface"> |
| <link rel="next" href="Accessing-Directories.html#Accessing-Directories" title="Accessing Directories"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| This file documents the GNU C library. |
| |
| This is Edition 0.12, last updated 2007-10-27, |
| of `The GNU C Library Reference Manual', for version |
| 2.8 (Sourcery G++ Lite 2011.03-41). |
| |
| Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, |
| 2003, 2007, 2008, 2010 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being ``Free Software Needs Free Documentation'' |
| and ``GNU Lesser General Public License'', the Front-Cover texts being |
| ``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A |
| copy of the license is included in the section entitled "GNU Free |
| Documentation License". |
| |
| (a) The FSF's Back-Cover Text is: ``You have the freedom to |
| copy and modify this GNU manual. Buying copies from the FSF |
| supports it in developing GNU and promoting software freedom.''--> |
| <meta http-equiv="Content-Style-Type" content="text/css"> |
| <style type="text/css"><!-- |
| pre.display { font-family:inherit } |
| pre.format { font-family:inherit } |
| pre.smalldisplay { font-family:inherit; font-size:smaller } |
| pre.smallformat { font-family:inherit; font-size:smaller } |
| pre.smallexample { font-size:smaller } |
| pre.smalllisp { font-size:smaller } |
| span.sc { font-variant:small-caps } |
| span.roman { font-family:serif; font-weight:normal; } |
| span.sansserif { font-family:sans-serif; font-weight:normal; } |
| --></style> |
| <link rel="stylesheet" type="text/css" href="../cs.css"> |
| </head> |
| <body> |
| <div class="node"> |
| <a name="Working-Directory"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Accessing-Directories.html#Accessing-Directories">Accessing Directories</a>, |
| Up: <a rel="up" accesskey="u" href="File-System-Interface.html#File-System-Interface">File System Interface</a> |
| <hr> |
| </div> |
| |
| <h3 class="section">14.1 Working Directory</h3> |
| |
| <p><a name="index-current-working-directory-1385"></a><a name="index-working-directory-1386"></a><a name="index-change-working-directory-1387"></a>Each process has associated with it a directory, called its <dfn>current |
| working directory</dfn> or simply <dfn>working directory</dfn>, that is used in |
| the resolution of relative file names (see <a href="File-Name-Resolution.html#File-Name-Resolution">File Name Resolution</a>). |
| |
| <p>When you log in and begin a new session, your working directory is |
| initially set to the home directory associated with your login account |
| in the system user database. You can find any user's home directory |
| using the <code>getpwuid</code> or <code>getpwnam</code> functions; see <a href="User-Database.html#User-Database">User Database</a>. |
| |
| <p>Users can change the working directory using shell commands like |
| <code>cd</code>. The functions described in this section are the primitives |
| used by those commands and by other programs for examining and changing |
| the working directory. |
| <a name="index-cd-1388"></a> |
| Prototypes for these functions are declared in the header file |
| <samp><span class="file">unistd.h</span></samp>. |
| <a name="index-unistd_002eh-1389"></a> |
| <!-- unistd.h --> |
| <!-- POSIX.1 --> |
| |
| <div class="defun"> |
| — Function: char * <b>getcwd</b> (<var>char *buffer, size_t size</var>)<var><a name="index-getcwd-1390"></a></var><br> |
| <blockquote><p>The <code>getcwd</code> function returns an absolute file name representing |
| the current working directory, storing it in the character array |
| <var>buffer</var> that you provide. The <var>size</var> argument is how you tell |
| the system the allocation size of <var>buffer</var>. |
| |
| <p>The GNU library version of this function also permits you to specify a |
| null pointer for the <var>buffer</var> argument. Then <code>getcwd</code> |
| allocates a buffer automatically, as with <code>malloc</code> |
| (see <a href="Unconstrained-Allocation.html#Unconstrained-Allocation">Unconstrained Allocation</a>). If the <var>size</var> is greater than |
| zero, then the buffer is that large; otherwise, the buffer is as large |
| as necessary to hold the result. |
| |
| <p>The return value is <var>buffer</var> on success and a null pointer on failure. |
| The following <code>errno</code> error conditions are defined for this function: |
| |
| <dl> |
| <dt><code>EINVAL</code><dd>The <var>size</var> argument is zero and <var>buffer</var> is not a null pointer. |
| |
| <br><dt><code>ERANGE</code><dd>The <var>size</var> argument is less than the length of the working directory |
| name. You need to allocate a bigger array and try again. |
| |
| <br><dt><code>EACCES</code><dd>Permission to read or search a component of the file name was denied. |
| </dl> |
| </p></blockquote></div> |
| |
| <p>You could implement the behavior of GNU's <code>getcwd (NULL, 0)</code><!-- /@w --> |
| using only the standard behavior of <code>getcwd</code>: |
| |
| <pre class="smallexample"> char * |
| gnu_getcwd () |
| { |
| size_t size = 100; |
| |
| while (1) |
| { |
| char *buffer = (char *) xmalloc (size); |
| if (getcwd (buffer, size) == buffer) |
| return buffer; |
| free (buffer); |
| if (errno != ERANGE) |
| return 0; |
| size *= 2; |
| } |
| } |
| </pre> |
| <p class="noindent">See <a href="Malloc-Examples.html#Malloc-Examples">Malloc Examples</a>, for information about <code>xmalloc</code>, which is |
| not a library function but is a customary name used in most GNU |
| software. |
| |
| <!-- unistd.h --> |
| <!-- BSD --> |
| <div class="defun"> |
| — Deprecated Function: char * <b>getwd</b> (<var>char *buffer</var>)<var><a name="index-getwd-1391"></a></var><br> |
| <blockquote><p>This is similar to <code>getcwd</code>, but has no way to specify the size of |
| the buffer. The GNU library provides <code>getwd</code> only |
| for backwards compatibility with BSD. |
| |
| <p>The <var>buffer</var> argument should be a pointer to an array at least |
| <code>PATH_MAX</code> bytes long (see <a href="Limits-for-Files.html#Limits-for-Files">Limits for Files</a>). In the GNU |
| system there is no limit to the size of a file name, so this is not |
| necessarily enough space to contain the directory name. That is why |
| this function is deprecated. |
| </p></blockquote></div> |
| |
| <!-- unistd.h --> |
| <!-- GNU --> |
| <div class="defun"> |
| — Function: char * <b>get_current_dir_name</b> (<var>void</var>)<var><a name="index-get_005fcurrent_005fdir_005fname-1392"></a></var><br> |
| <blockquote><p><a name="index-PWD-1393"></a>This <code>get_current_dir_name</code> function is basically equivalent to |
| <code>getcwd (NULL, 0)</code><!-- /@w -->. The only difference is that the value of |
| the <code>PWD</code> variable is returned if this value is correct. This is a |
| subtle difference which is visible if the path described by the |
| <code>PWD</code> value is using one or more symbol links in which case the |
| value returned by <code>getcwd</code> can resolve the symbol links and |
| therefore yield a different result. |
| |
| <p>This function is a GNU extension. |
| </p></blockquote></div> |
| |
| <!-- unistd.h --> |
| <!-- POSIX.1 --> |
| <div class="defun"> |
| — Function: int <b>chdir</b> (<var>const char *filename</var>)<var><a name="index-chdir-1394"></a></var><br> |
| <blockquote><p>This function is used to set the process's working directory to |
| <var>filename</var>. |
| |
| <p>The normal, successful return value from <code>chdir</code> is <code>0</code>. A |
| value of <code>-1</code> is returned to indicate an error. The <code>errno</code> |
| error conditions defined for this function are the usual file name |
| syntax errors (see <a href="File-Name-Errors.html#File-Name-Errors">File Name Errors</a>), plus <code>ENOTDIR</code> if the |
| file <var>filename</var> is not a directory. |
| </p></blockquote></div> |
| |
| <!-- unistd.h --> |
| <!-- XPG --> |
| <div class="defun"> |
| — Function: int <b>fchdir</b> (<var>int filedes</var>)<var><a name="index-fchdir-1395"></a></var><br> |
| <blockquote><p>This function is used to set the process's working directory to |
| directory associated with the file descriptor <var>filedes</var>. |
| |
| <p>The normal, successful return value from <code>fchdir</code> is <code>0</code>. A |
| value of <code>-1</code> is returned to indicate an error. The following |
| <code>errno</code> error conditions are defined for this function: |
| |
| <dl> |
| <dt><code>EACCES</code><dd>Read permission is denied for the directory named by <code>dirname</code>. |
| |
| <br><dt><code>EBADF</code><dd>The <var>filedes</var> argument is not a valid file descriptor. |
| |
| <br><dt><code>ENOTDIR</code><dd>The file descriptor <var>filedes</var> is not associated with a directory. |
| |
| <br><dt><code>EINTR</code><dd>The function call was interrupt by a signal. |
| |
| <br><dt><code>EIO</code><dd>An I/O error occurred. |
| </dl> |
| </p></blockquote></div> |
| |
| </body></html> |
| |