【问题标题】:chdir(..) returns 0 for success and changes directory, but outputs "No such file or directory"chdir(..) 成功返回 0 并更改目录,但输出“没有这样的文件或目录”
【发布时间】:2014-10-04 22:13:00
【问题描述】:

我正在使用充当简单外壳的 C 程序中的系统调用来实现 cd 功能,并且在目录名称方面存在一些问题。我觉得它与字符串无关,但到目前为止我还没有运气。

我有如下函数:

static void parse_args(int argc, char **argv) {

    // Special conditions:
    if (strcmp(argv[1], "return") == 0) {
        exit(0);
    }
    else if (strcmp(argv[1], "cd") == 0) {

        if (strcmp(argv[2], "mydir") == 0) {
            printf("Directory name is 'mydir'!\n");
        } else {
            printf("Directory name is NOT 'mydir'!\n");
        }

        int ret = chdir(argv[2]);
        if (ret == 0) { // success
            printf("Able to change directory.\n");
        } else {
            printf("UNABLE to change directory.\n");
        }
    }

    // Handling piping for shell ....
}

我预先知道argv[2] 是一个包含我想要的新目录的字符串。

我希望cd 进入一个名为mydir 的现有目录,并调用changeDirectoryargv[2] 等于"mydir"。但是,如您所见,在changeDirectory 内部,我验证argv[2] 实际上完全等于“mydir”。

我的简单shell调用的结果是:

$> pwd
/foo/bar
$> cd mydir
Directory name is 'mydir'!
UNABLE to change directory.
/usr/bin/cd: line 4: cd: mydir: No such file or directory
$> pwd
/foo/bar/mydir

所以看起来命令成功了,但是我不知道为什么我会收到错误消息。 有趣的是,如果我调用int ret = chdir("mydir");,则不会出现此错误消息 我可以以某种方式强制/清理此参数吗?任何指针将不胜感激。我可以散吗

【问题讨论】:

  • 您显示的代码与输出不匹配,请显示实际代码。而且您没有在其他地方打印错误消息?
  • 已经看过这个问题或非常非常相似的东西。 chdir 不调用外部 /usr/bin/cd。在代码中找到调用它的位置并修复它。
  • 什么是/usr/bin/cd?一些系统确实有这样的命令,但它几乎没有意义——而且你向我们展示的代码并没有调用它。
  • 啊,换目录后忘记退出功能了。因此,我试图稍后以cd 作为参数执行execvp..

标签: c string pointers cd chdir


【解决方案1】:

原来我在更改目录后忘记退出该功能。在函数的后面,我将cd 作为参数传递给execvp 来执行它,就好像它是一个程序一样。只需将后面的“处理管道”代码封装在 else 中即可解决此问题。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2012-11-15
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多