函数chdir、fchdir和getcwd
chdir、fchdir函数
每个进程都有一个当前工作目录,当前目录是进程的一个属性
当用户登录UNIX系统时,其当前工作目录通常是口令文件/etc/passwd中该用户登录项的第6个字段
进程调用chdir或fchdir函数可以更改当前工作目录
#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int fd);
Both return: 0 if OK, ?1 on error
代码1. chdir和fchdir函数原型
实例
/**
* 文件内容:因为当前工作目录是进程的一个属性,所以它只影响到调用chdir的进程本身
* 而不影响其他进程
* 文件时间:
* 作者:[email protected]
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
if (chdir("/tmp") < 0)
{
err_sys("chdir failed");
}
printf("chdir to /tmp succeeded\n");
exit(0);
}
代码2. chdir函数实例
编译如下:
gcc main.c -lerror -Llib
运行如下:
$ pwd
/home/fireway/study/temp2
$ ./a.out
chdir to /tmp succeeded
从中我们可以看出,执行a.out命令的shell的当前目录并没有改变,这是shell执行程序工作方式的一个副作用
每个程序运行在独立的进程中,shell的当前工作目录并不会随着程序调用chdir而改变。由此可见,为了改变shell进程自己的工作目录,shell应当直接调用chdir函数,为此,cd命令内建在shell中。
getcwd函数
#include <unistd.h>
char *getcwd(char *buf, size_t size);
Returns: buf if OK, NULL on error
代码3. getcwd函数原型
必须向此函数传递两个参数,一个是缓冲区的地址buf, 另一个是缓冲区的长度size
注意,该缓冲区必须有足够长的长度以容纳绝对路径名再加上一个终止的null字节,否则返回出错
实例
/**
* 文件名:mycwd.c
* 文件内容: 将工作目录更改至一个指定目录,然后调用getcwd,最后打印该工作目录
* 时间:2016年 11月 14日 星期一 07:59:08 CST
* 作者:[email protected]
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "pathalloc.h"
int main(void)
{
char *ptr = NULL;
size_t size = 0;
if (chdir("/usr/spool/uucppublic") < 0)
{
err_sys("chdir failed");
}
ptr = path_alloc(&size);
if (getcwd(ptr, size) == NULL)
{
err_sys("getcwd failed");
}
printf("cwd = %s\n", ptr);
if (ptr != NULL)
{
free(ptr);
ptr = NULL;
}
exit(0);
}
代码4. getcwd函数实例
编译此程序
gcc main.c -lerror -L../temp3
运行此程序
# ln -s /home/fireway/study/temp3 /usr/spool
# ./a.out
cwd = /home/fireway/study/temp3/uucppublic
# ls -l /usr/spool
lrwxrwxrwx 1 root root 25 11月 14 08:24 /usr/spool -> /home/fireway/study/temp3
注意,chdir跟随符号链接,当是当getcwd沿着目录树上溯到/home/fireway/study/temp3目录时,它并不了解该目录由符号链接/usr/spool所指向。这就是符号链接的一种特性。
getcwd函数可以让我们在更换目录之前,先保存之前的工作目录,在完成之后,就可以将保存的原工作目录路径名作为参数传递给chdir,这样就返回了文件系统的出发点。
fchdir函数提供更快捷简便 的方式,在更换到其他路径之前,无需调用getcwd函数,而是调用open打开当前工作目录,然后保存其返回的fd, 当希望回到原工作目录时,只要简单地将fd传递给fchdir。
参考
UNIX环境高级编程(第三版) 4.23 函数chdir、fchdir和getcwd