Как использовать системную функцию chdir

Я пытаюсь использовать chdir для изменения рабочего каталога моего процесса. Скажем, у меня есть каталог Apple в моем текущем каталоге. Почему, когда я ввожу яблоко в подсказке, возвращаемый результат равен -1? Это потому, что когда я ввожу яблоко, символ «\n» также помещается в конец строки? Кроме того, какой смысл менять каталог, если я могу просто использовать переменную для его хранения?

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>

int main(void){
    char path[256];
    fgets(path, 256, stdin);
    printf("%s", path);
    int result = chdir(path);
    if(result != 0){
        printf("%d\n", result);
    }
}

person Louis Kuang    schedule 20.09.2015    source источник
comment
chdir() смотрите здесь: man7.org/linux/man-pages/ man2/chdir.2.html или введите man 2 chdir на консоли.   -  person alk    schedule 20.09.2015
comment
вы правы в отношении переменной «путь», содержащей новую строку. Есть несколько способов избавиться от новой строки. Я использую: char *newline = strstr( path, "\n"); if (newline) { *newline = '\0';}   -  person user3629249    schedule 21.09.2015
comment
Примечание: поскольку программа запускается в отдельном процессе, при завершении программы текущий рабочий каталог будет таким же, как и до запуска программы.   -  person user3629249    schedule 21.09.2015


Ответы (1)


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

Из man fgets() (курсив мой ):

fgets() считывает не более одного символа меньше size из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере.


Примечание об отладке: если вы поместите «строку» для печати (как прочитано fgets()) в кавычки, подобные этой

printf("'%s'", path);

вы могли заметить \n в конце.

person alk    schedule 20.09.2015
comment
Понятно, но можете ли вы сказать мне, что на самом деле делает chdir? Потому что я пишу задание на реализацию функции cd оболочки? - person Louis Kuang; 20.09.2015
comment
@lplouis: chdir() изменяет текущий рабочий каталог процесса. - person alk; 20.09.2015
comment
Придирка: fgets(3) не дополняет результат \n. Он просто копирует его из ввода в буфер. Если EOF достигается без \n, в буфере не будет завершающей новой строки - ваш ответ, кажется, говорит об обратном. - person Filipe Gonçalves; 20.09.2015
comment
@FilipeGonçalves: исправлено. - person alk; 20.09.2015