chdir(..)返回0表示成功并更改目录,但是输出"没有这样的文件或目录"

时间:2014-10-04 22:13:00

标签: c string pointers cd chdir

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

我有以下功能:

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的现有目录,并调用changeDirectory argv[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"); ,则不会出现此错误消息 我可以以某种方式投射/消毒这个参数吗?任何指针都将非常感激。我可以吗?

1 个答案:

答案 0 :(得分:1)

原来我忘了在更改目录后退出该功能。稍后在函数中,我将cd作为参数传递给execvp来执行它,就好像它是一个程序一样。简单地封装后来的" Handle Piping" else中的代码解决了此问题。