函数chdir、fchdir和getcwd
chdir、fchdir函数
每个进程都有一个当前工作目录,当前目录是进程的一个属性
当用户登录UNIX系统时,其当前工作目录通常是口令文件/etc/passwd中该用户登录项的第6个字段
进程调用chdir或fchdir函数可以更改当前工作目录
#include<unistd.h>
int chdir(constchar*pathname);
int fchdir(int fd);
Bothreturn:0if OK,−1 on error
代码1. chdir和fchdir函数原型
实例
/**
* 文件内容:因为当前工作目录是进程的一个属性,所以它只影响到调用chdir的进程本身
* 而不影响其他进程
* 文件时间:
* 作者:firewaywei@126.com
*/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
if(chdir("/tmp")<0)
{
err_sys("chdir failed");
}
printf("chdir to /tmp succeeded ");
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
* 作者:firewaywei@126.com
*/
#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 ", 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。