chdir系统调用不会改变我当前的工作目录

编程语言 2026-07-11

我正在用C 实现一个小型Shell,学校项目要求的内置命令之一是 cd。为此,我使用 chdir 来理解一些关于目录移动的基础操作。

我读过关于 cd 的man手册,并且明白要完成的不只是调用 chdir,还需要更多步骤。我需要更新 PWDOLDPWD 环境变量,并且要处理大量边缘情况,但现在我还遇到一个更根本的问题。

当我在其中一个现有目录上调用它时,chdir 的退出码确实是0(正如它的手册所说,表示执行成功),但终端中的工作目录并未改变。

我到底错过了什么?

我看到了两个可能的问题:

  1. 我还没有正确实现 chdir
  2. 我确实实现了,但需要把它放到循环中执行。

下面是main:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>


typedef enum s_err
{
    BUILTIN_SUCCESS = 0,
    SUCCESS = 0,
    BUILTIN_ERROR = 1,
    ERROR = 1
}   t_error;

int main(int argc, char **argv, char **envp)
{
    int     exit_status;

    argv++;
    envp++;
    if (argc == 0)
        return (BUILTIN_ERROR);
    exit_status = chdir("../Libft");
    if (exit_status == -1)
        perror("chdir");
    return (0);
}

实现其他系统调用并不能解决问题,作业要求我让 chdir 在这个场景中工作。

解决方案

如果你更仔细地阅读 man页面,你会看到它还写着:

chdir() 函数只会影响当前进程的工作目录。

所以,你的程序只是在更新它自己的PWD。每个进程都有自己的环境变量,因此启动你程序的进程的PWD不会受到影响。这就是为什么在你的程序退出后,你在系统终端中看不到新的PWD生效的原因。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章