每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜线开始的路径名为相对路径名)。当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第6个字段----用户的起始目录(home directory)。当前工作目录是进程的一个属性,起始目录则是登录名的一个属性。
进程调用chdir或fchdir函数可以更改当前工作目录。
#include <unistd.h> int chdir(const char *pathname); int fchdir(int fd); 两个函数的返回值:若成功,返回0;若出错,返回-1 |
在这两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。
因为内核必须维护当前工作目录的信息,所以我们应能获取其当前值。遗憾的是,内核为每个进程值保存指向该目录v节点的指针等目录本身的信息,并不保存该目录的完整路径名。
我们需要一个函数,它从当前工作目录(.)开始,用..找到上一级目录,然后读取器目录项,直到该目录项的i节点编号与工作目录i节点编号相同,这样地就找到了其对应的文件名。按照这种方法,逐层上移,直到遇到根,这样就得到了当前工作目录完整的绝对路径名。很幸运,函数getcwd就提供了这种功能。
#include <unistd.h> char *getcwd(char *buf, size_t size); 返回值:若成功,返回buf;若出错,返回NULL |
必须向此函数传递两个参数,一个是缓冲区地址buf,另一个是缓冲区的长度size(以字节为单位)。该缓冲区必须由足够的长度以容纳绝对路径名再加上一个终止null字节,否则返回出错。
当一个应用程序需要在文件系统中返回到它工作的出发点时,getcwd函数是有用的。在更换工作目录之前,我们可以调用getcwd函数先将其保存起来。在完成了处理后,就可将所保存的原工作目录路径名作为调用参数传送给chdir,这样就返回到了文件系统中的出发点。
fchdir函数向我们提供了一种完成此任务的便捷方法。在更换到文件系统各种的不同位置前,无需调用getcwd函数,而是使用open打开当前工作目录,然后保存其返回的文件描述符。当希望回到原工作目录时,只要简单地将该文件描述符传送给fchdir。