1. getcwd函数
每一个进程都有一个工作目录,而getcwd函数用于获取当前进程的当前工作目录,而当前工作目录是当前进程的一个属性,它只影响当前进程本身,并不会影响其他进程。
从字面意思上理解当前工作目录就是,当前进程的当前运行工作目录,默认是进程在执行程序时所在的目录位置。
函数原型:
char *getcwd(char *buf, size_t size);
参数说明:
buf:保存当前进程工作目录位置的路径
size: buf的大小
返回值:
成功,将当前进程工作目录位置保存到参数buf中,失败返回NULL。
2. chdir函数
chdir函数用于改变当前进程的当前工作目录
函数原型:
int chdir(const char *pathname);
参数说明:
pathname:指定要改变工作目录的路径
返回值说明:成功则返回0;失败返回-1并设置errno为相应值
3. getcwd程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
//当前目录是在test目录
int main(void){
char buf[64];
//获取对当前进程的工作目录,pwd后面输出当前进程的工作目录是test目录
printf("pwd1:%s\n", getcwd(buf, sizeof(buf)));
//改变当前进程工作目录为上一级目录
if(-1 == chdir("../")){
perror("chidr failed");
return -1;
}
//再次获取当前进程的工作目录
printf("pwd2: %s\n", getcwd(buf, sizeof(buf)));
return 0;
}
编译并执行:
gcc -o getcwd getcwd.c
./getcwd
程序执行结果:
在程序执行的期间,通过打印信息可以发现,工作目录确实改变了,但是程序执行完毕,又回到了当前的工作目录。
分析程序执行过程:
第一次调用getcwd的时候,输出的是当前进程的工作目录为/testcode目录(默认是进程在执行程序时所在的目录位置),再调用chdir函数改变当前进程的工作目录为上一级目录,然后再次获取当前进程的工作目录是testcode的上一级目录,即/根目录。
当执行到return 0时,当前进程运行结束,但是我们发现,工作目录和执行程序之前一样,并没有被修改。
原因在于:
这是因为程序执行之前,testcode是当前shell进程的当前工作目录。当getcwd.c程序一执行,当前进程是当前运行的这个getcwd进程,不再是shell进程,但是并不意味着shell进程就结束了,在不关终端的情况下shell进程是一直存在的。
在这种情况下,shell进程只是暂时休假去了,只要当前的getcwd进程运行结束,shell进程又会回来继续工作。前面我们也说过:当前工作目录是进程的一个属性,它只影响当前进程本身,并不会影响其他进程
。
而getcwd进程和shell进程是两个不同的进程,执行期间互相不干扰,当前进程修改了工作目录并不会影响到shell进程的工作目录,所以shell进程的当前工作目录还是test目录。