Функция chdir() ведет себя странно
int cmd_cd(char* argv[]) {
if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
struct passwd *pw = getpwuid(getuid());
if(argv[1] == NULL || strlen(argv[1]) == 1){
argv[1] = pw->pw_dir;
}
else{
char path[strlen(pw->pw_dir) + strlen(arg[1])];
strcpy(path, pw->pw_dir);
argv[1] = &argv[1][1];
strcat(path, argv[1]);
argv[1] = path;
}
}
if(chdir(argv[1])<0) {
printf("Not a valid path\n");
return -1;
}
return 0;
}
Выше приведен фрагмент кода, в котором я пытаюсь сделать игрушечную оболочку Linux. Но код выше глючит, когда я печатаю
$ cd ~/code
он выполняется, как и ожидалось, но в приведенном ниже случае он говорит "Неправильный путь". И я не могу понять, почему.
$ cd ~/code / [name_of_some_valid_directory]
2 ответа
path
удаляется при выходе из блока, который он определил.
Попробуй это:
int cmd_cd(char* argv[]) {
char *path = NULL;
if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
struct passwd *pw = getpwuid(getuid());
if(argv[1] == NULL || strlen(argv[1]) == 1){
argv[1] = pw->pw_dir;
}
else{
path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
if (path == NULL){
printf("Memory allocation failed\n");
return -1;
}
strcpy(path, pw->pw_dir);
argv[1] = &argv[1][1];
strcat(path, argv[1]);
argv[1] = path;
}
}
if(chdir(argv[1])<0) {
printf("Not a valid path\n");
if (path != NULL) free(path);
return -1;
}
if (path != NULL) free(path);
return 0;
}
добавлять #include <stdlib.h>
в голову вашего кода, если необходимо использовать malloc
а также free
,
Значение назначено здесь
argv[1] = path;
здесь больше не действует
if(chdir(argv[1])<0) {
как область ({...}
) в котором path
определен, действительно уже был оставлен, так argv[1]
указывает на неверную память.
Призыв к chdir()
затем обращается к этой неверной памяти, которая, в свою очередь, провоцирует печально известное неопределенное поведение, с этого момента может произойти все что угодно.