chdir() возвращает 0, но отладка в следующей строке после вызова chdir() показывает, что каталог не изменился

MyCode:

    int ushExCd(Cmd cmd){ // BuiltIn shell command implementation
        char * home = "HOME";
        int returnVal = 1;
        if(cmd->nargs > 1){ // target directory is specified in args[1]
            returnVal = chdir(cmd->args[1]);
        }else{ // target directory is not specified, use "HOME" instead
            returnVal = chdir(getenv(home));
        }
        if(-1 == returnVal){
            perror("cd");
        }
        return 1;
    }

Использование отладчика llvm для проверки returnVal сразу после его присваивания показывает, что его значение равно 0 (хотя оно инициализировано в 1), но делает p (char*)getenv("PWD") в отладчике сразу после chdir() Системный вызов показывает, что каталог не изменился.

Я использовал XCode, но затем я попытался использовать оболочку bash и tcsh без компиляторов gcc.

Что еще более интересно, тот же фрагмент кода успешно выполняется в оболочке, которую реализовал другой человек, что может указывать на неправильную реализацию оболочки, но затем я отлаживаю прямо в этом фрагменте кода, и не должно быть никакого способа chdir() теряется в более поздний момент времени.

1 ответ

Я думаю, что getenv("PWD") даст вам текущий каталог, когда ваша программа была запущена.

Чтобы узнать текущий каталог, используйте getcwd(),

Другие вопросы по тегам