В настоящее время я выполняю задание, в котором мне нужно реализовать функциональность pwd
без использования getcwd
или getenv
. Тем не менее, я застрял в бесконечном цикле, потому что, когда я использую chdir("..")
, мне кажется, что я возвращаюсь в тот же каталог, как только я достигаю корня. Я нашел похожий вопрос , но он был решен с помощью модуля perl, так что это не помогло.
Моей первой мыслью было отследить предыдущее имя каталога и сравнить его с текущим именем каталога, чтобы убедиться, что они совпадают, но я не вижу способа сделать это, потому что у меня нет размера имя каталога и между именами каждого файла или каталога в d_name
.
есть нулевые символы
Вот мой код (обратите внимание, что в нем, вероятно, есть и другие ошибки, но мне нужно сначала решить эту проблему):
#include <stdio.h>
#include <dirent.h>
#include <linux/limits.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void get_path(char *path, int path_len);
int main(void)
{
int path_len = -1;
char path[PATH_MAX];
/* get and print the path */
get_path(path, path_len);
path[0] = '\0';
printf("%s\n", path);
return 0;
}
/* get the path from the current directory to the root */
void get_path(char *path, int path_len)
{
struct dirent *dirp;
DIR *dp;
/* open current dir */
if ((dp = opendir(".")) == NULL)
{
perror("mypwd");
exit(1);
}
/* go through this dir */
while ((dirp = readdir(dp)) != NULL)
{
/* found its parent */
if (strcmp(dirp->d_name, "..") == 0)
{
/* on to a new path */
path_len++;
if (path_len > PATH_MAX)
{
fprintf(stderr, "path too long\n");
exit(1);
}
/* go to parent and continue */
chdir("..");
get_path(path, path_len);
/* add this name to our path */
strcat(path, dirp->d_name);
}
}
closedir(dp);
}
Как я могу определить, достиг ли я корня файла?