15-getcwd和chdir函数

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目录。

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/80890901
今日推荐