我的chdir()函数不起作用。为什么?

时间:2014-01-31 05:40:06

标签: c linux bash strtok chdir

我正在编写一个程序,要求用户输入linux bash命令,然后将它们存储在指针数组中(有点像char *argv[])。然后,程序必须检查此命令是正常的bash命令还是cd (change directory)命令。如果是cd命令,那么它应该使用chdir()之类的东西。如果该命令是其他任何我想使用exec()系统调用的一些变体来执行该命令。

但是我没有成功完成第一部分(chdir())。

int ii=-1
printf("Enter the command: ");
fgets(command, 100, stdin);
command[strlen(command)-1]=0;
printf("Command = %s\n", command);


if (command[0]=='c' && command[1]=='d' && command[2]==' ')
{
    printf("I am inside CD now.\n");
    cd_dump[0] = strtok(command," ");
    while(sub_string[++ii]=strtok(NULL, " ") != NULL)
    {
        printf("%s\n", sub_string[0]);
    }

    chdir(sub_string[0]);
}

编辑:     我也尝试了以下if语句但没有运气。

if (command[0]=='c' && command[1]=='d' && command[2]==' ')
{
    printf("I am inside CD now.\n");
    chdir(command+3);
}

可悲的是,该计划没有按照我的意愿行事,即使在数小时试图解决问题之后,我也不知道为什么。我做错了什么?另外,如果我输入cd /home/为什么输出结果在sub_string [0]中最终会在输出上增加一个“输入键”? strtok是否将Enter键保存到字符串中?

非常感谢有关此主题的任何帮助。

2 个答案:

答案 0 :(得分:2)

调用chdir()仅影响当前进程,而不影响其父进程。

如果你chdir()并立即退出,那就毫无意义了 - 你调用它的shell保留了它的旧cwd。这就是cd始终是内置shell的原因。

使用

char buffer[PATH_MAX];
if (getcwd(buffer, sizeof buffer) >= 0) {
    printf("Old wd: %s\n", buffer);
}
chdir(command+3);
if (getcwd(buffer, sizeof buffer) >= 0) {
    printf("New wd: %s\n", buffer);
}

验证chdir()是否正常工作。

答案 1 :(得分:0)

我想我会做这样的事情:

if (command[0]=='c' && command[1]=='d' && command[2]==' ')
{
    for(i=2, i++, command[i]!=' ');  /* Skip to nonspace */
    chdir(command+i);
}