【问题标题】:cwd back to the original pathcwd 回到原来的路径
【发布时间】:2021-10-04 19:43:43
【问题描述】:

我正在使用 C 语言制作自己的 shell。

在初始阶段,我的 cwd 是“/Users/Henry/test”。

其中一个功能是当我打开一个文件时,shell 不应该在当前工作文件夹 (cwd) 中搜索该文件。

相反,它应该在文件夹“/usr”中搜索,然后在“/usr/bin”中搜索。我的代码:

int commandHandler(char** parsed)
{
        chdir("/usr");
        int ret;
        ret = chdir(parsed[1]);
        if(ret != 0)
           chdir("/usr/bin");
           ret = chdir(parsed[1]);
        return 0;
}

这会将我当前的工作目录更改为“/usr/bin”。

此功能仅适用于“cd”命令。其他命令如“ls”、文件执行./out 等应使用实际工作目录“/Users/Henry/test”。

如何更改我的目录?我可以在程序初始化时使用目录名称设置一个全局变量,然后在我想改回 cwd 时调用它吗?

【问题讨论】:

  • 是的,你可以这样做。
  • 您是否尝试在chdir 调用之前使用getcwd(...) 函数获取CWD?只需记住 chdir 并保存值
  • 或者将其存储在当前函数上下文中声明的缓冲区中。如果堆栈便宜,则应尽可能避免使用全局变量。

标签: c linux shell chdir


【解决方案1】:

最可靠的机制是结合使用 POSIX 函数 fchdir()open()。您使用open() 打开目录(O_DIRECTORY 标志并非随处可用,但如果未定义通常可以省略)并保存文件描述符。然后您可以使用chdir() 更改到指定目录,但您可以使用fchdir() 更改回原始目录,并传递保存的文件描述符。

int owd = open(".", O_RDONLY|O_DIRECTORY);
…error check…
if (chdir(new_working_directory) == 0)
{
    …work in new directory…
    fchdir(owd);    // Change back to old working directory
}
close(owd);         // Avoid leaking file descriptors

【讨论】:

  • 您可能会补充说,即使它被重命名或移动,此方法也允许更改回原始目录,即:如果路径已更改,即使它已被删除。
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2022-07-05
  • 1970-01-01
  • 2021-08-22
  • 2022-01-12
相关资源
最近更新 更多