Почему chdir ("~ / dev /") возвращает -1? - PullRequest
3 голосов
/ 06 апреля 2011

В моем приложении c ++ я хочу изменить рабочий каталог на указанный. Но когда я указываю "~/dev/" в качестве рабочего каталога, chdir() терпит неудачу и возвращает -1. Вместо этого это работает, когда я указываю "/home/myusername/dev". Почему это происходит? Как я могу решить эту проблему (кроме проверки, является ли первый символ строки ~ и заменой на /home/myusername)?

Ответы [ 6 ]

4 голосов
/ 06 апреля 2011

Расширение тильды (~) до переменной среды HOME выполняется bash. Это расширение выполняется до того, как оно передается команде chdir. Нижняя строка ~ обрабатывается bash, а не командой chdir. Поэтому вы не можете использовать его в вызове функции chdir ().

Чтобы найти другие виды расширений (и подробности ~ расширения), выполняемые bash, проверьте эту ссылку .

2 голосов
/ 06 апреля 2011

Вы можете использовать следующее, чтобы получить то, к чему ~ может быть расширен (используя getpwuid):

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <pwd.h>

// @prefer_env should be TRUE if you prefer the value of the $HOME
//  environment variable over what is stored in the user's passwd
char* get_homedir(int prefer_env)
{
    char *found = getenv("HOME");
    char *homedir = NULL;

    if (!prefer_env || !found)
    {
        struct passwd *pw = getpwuid(geteuid());
        if (pw && pw->pw_dir) found = pw->pw_dir;
    }

    if (found)
    {
        // I would add error checking
        homedir = (char*)malloc(strlen(found) + 1);
        strcpy(homedir, found);
    }

    return homedir;
}
1 голос
/ 06 апреля 2011

Как указывалось в предыдущих ответах, библиотека C не заменяет собой ~.Это делается оболочкой.Не следует предполагать, что домашним каталогом пользователей является / home / myusername, так как это не может быть предположено.

Правильный способ определения домашнего каталога - проверить переменную среды HOME и прочитать ее содержимое.Обычно оно определяется, но в противном случае вы должны использовать getpwuid () или аналогичный вызов для получения ввода пароля для текущего пользователя, который будет включать его домашний каталог.

1 голос
/ 06 апреля 2011

Ну ~ обычно заменяется вашим домашним каталогом вашей оболочкой, когда вы набираете его до того, как оболочка вызовет какой-либо программный вызов (даже если компакт-диск не является программным вызовом, а реализован в самой оболочке).* В любом случае: в C нет способа автоматически заменить ~ на homedir

1 голос
/ 06 апреля 2011

Разрешение ~, как и любая переменная среды, попадает в оболочку. Я не думаю, что вы можете использовать его в функциях C api.

0 голосов
/ 06 апреля 2011

Попробуйте вместо этого использовать $ HOME, ~ просто ярлык для $ HOME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...