【问题标题】:How can a program change a directory without using chdir()?程序如何在不使用 chdir() 的情况下更改目录?
【发布时间】:2021-12-13 04:45:42
【问题描述】:

我可以找到很多关于使用chdir() 更改程序目录(例如,命令外壳)的文档。我想知道是否有可能在不使用chdir() 的情况下以某种方式做同样的事情。然而,我找不到任何文档或代码示例,其中有人在不使用chdir() 的情况下更改目录。这可能吗?

【问题讨论】:

  • 简答:否。
  • 您想要/需要在没有chdir 的情况下更改目录的根本问题是什么?
  • chdir() 是系统调用,没有比这更原始的了。
  • Weeelll,有fchdir(),你可以自己调用系统调用。
  • @kaylum 我的一位教授正在讨论一项关于构建类似 linux 的 shell 程序的任务,他希望在其中使用某个命令来更改我们所在的目录。问题是他给出了一个我们无法做到的规范使用 chdir()。我什至不知道这是可能的。看起来我可能以某种方式误解了他的指示,因为这似乎并不可行。

标签: linux system-calls


【解决方案1】:

在 Linux 中,chdir() 是一个系统调用。这意味着它不是程序在自己的内存中执行的操作,而是请求操作系统内核代表程序执行某些操作。

当然,它是两个可以更改目录的系统调用之一——另一个是fchdir()。从理论上讲,您可以使用另一个,尽管这是否是您的教授真正想要的,还有待解释。


关于为什么chdir()fchdir() 不能由应用程序重新实现但需要加以利用:当前工作目录是内核代表程序维护的进程状态之一;程序本身不能访问内核内存而不要求内核代表它进行操作。

事物是系统调用,因为它们需要是系统调用——如果某件事可以在进程中完成,它那样完成(跨越用户空间和内核空间之间的边界涉及上下文切换惩罚;它并非没有性能影响)。在这种情况下,让内核准确记录进程的工作目录是确保在加载新的可执行文件(execve())时维护工作目录,并有助于确保内核记录的完整性(使确保程序不能假装其当前工作目录是它实际上无权访问的目录)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2016-09-25
    • 2010-09-17
    • 2011-12-13
    相关资源
    最近更新 更多