【问题标题】:The cd command in C and use of chdir()C 中的 cd 命令和 chdir() 的使用
【发布时间】:2019-05-07 22:13:41
【问题描述】:

我的任务是用 C 语言编写 linux cd 命令。我认为使用 chdir() 方法会很简单,但我的目录并没有改变。有趣的是 chdir() 的返回状态是 0,而不是 -1,这意味着 chdir() 没有失败。这是我使用chdir()的两种情况:

1.

    char *dir = getenv("HOME");   // Here dir equals the home environment.
    int ret = chdir(dir);

    printf("chdir returned %d.\n", ret);

ret 返回 1。

2.

    int ret = chdir(dir);   // Here dir equals the user's input.

    printf("chdir returned %d.\n", ret);

ret 如果目录存在于我的路径中,则返回 1。

我使用chdir() 错了吗?我似乎无法在任何地方找到答案。任何帮助将不胜感激。

【问题讨论】:

  • 你如何确定“你的目录没有改变”?
  • 你希望它改变你所在的 shell 的目录吗?如果是这样,搜索网络将帮助您。
  • 如何检查 cwd 是否未更改?您意识到chdir()“仅”更改了调用它的进程的 cwd?
  • 您不能将cd 写为外部实用程序。如果要写一个完整的shell,一定要先避免fork()ing
  • @thatotherguy 技术上你可以... 如果移动的外壳知道(可能没有):unix.stackexchange.com/a/94365/23529跨度>

标签: c linux cd


【解决方案1】:

chdir()只改变调用进程的工作目录。

所以当你有类似...的代码时

int main() {
  // 1
  chdir("/"); // error handling omitted for clarity
  // 2
}

...并将其编译为程序example,然后在shell中运行:

$ pwd # 3
/home/sweet
$ ./example # 4
$ pwd # 5
/home/sweet

那么你有两个进程在起作用,

  1. shell,您在其中输入pwd./example

  2. ./example,使用您的编译程序启动的进程(由 shell)。

chdir() 是编译程序的一部分,而不是 shell,因此它只影响程序的进程, shell。

所以,在// 1,您的程序的工作目录(在上面的示例运行中)是/home/sweet,但在// 2,它是/,正如上面chdir() 调用中指定的那样。这不会影响 shell 和 pwd # 5 的输出!

【讨论】:

  • 明白了,感谢您详细说明。 @Swordfish 帮助我意识到我对流程感到困惑。
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 2013-12-18
  • 2012-08-16
  • 1970-01-01
  • 2013-06-25
  • 2023-02-01
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多