分类: 系统运维
2012-03-28 14:05:41
每个进程都有一个当前工作目录。这个目录是所有相对路径(不以斜杠开头的路径)开始查找的地方。当一个用户登录一个UNIX系统时,当前工作目录一般从文 件/etc/passwd里的第6个域指定的目录--用户的主目录--开始。当前工作路径是进程的一个属性,主目录是登录名的一个属性。
我们可以用chdir和fchdir函数来改变进程的当前路径。
我们可以用路径名或文件描述符来指定一个新的当前工作目录。
fchdir函数不是基本POSIX.1规范的一部分,它是SUS的一个XSI扩展。本文讨论的4个平台都支持fchdir。
下面的代码把当前工作目录改为“/tmp":
因为内核必须维护当前工作目录的信息,我们应该可以得到它的当前值。不幸的是,内核并不维护这个目录的完全路径,而是关于目录的信息,比如指向目录v-node的指针。
我们需要的是一个从当前工作目录(点)开始,并使用点点往上遍历其层次的函数。每进入上一层目录时,函数读取它的目录项,直到找到对应于进入该目录前的目
录的i-node的名字。重复这个过程,直到到达要目录,从而得到当前工作目录的整个绝对路径。幸运的是,已经有一个函数来为我们完成这个任务了。
我们必须给这个函数传递一个缓冲区,buf,的地址,以及它的(字节)大小。这个缓冲区必须足够大以容下绝对路径名加一个终止null字节,不然会返回错误。(回想下2.5.5节关于为最大尺寸的路径名分配空间的讨论。)
一些getcwd的早期实现允许第一个参数为NULL。这种情况下,函数调用malloc来动态分配size大小的字节。这不是POSIX.1的部分,也不是SUS的部分,所以应该避免使用。
看下面的代码:
当我们有一个需要返回到原来的文件系统的位置的程序时,getcwd函数有很有用的。我们可以在改变我们的工作目录之前调用getcwd来保存开始位置。在完成我们的操作后,我们可以把从getcwd得到的路径名传给chdir来返回到我们在文件系统的开始的位置。
fchdir函数提供我们完成这个任务的一个简单方法。不需要使用getcwd,我们可以在进入文件系统别的位置前用open当前目录并保存文件描述符。当我们想要返回我们开始的位置时,我们可以简单地把描述符会给fchdir。