Как выяснить, является ли текущий каталог корнем в C? - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я выполняю задание, в котором мне нужно реализовать функциональность 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);
}

Как я могу определить, достиг ли я корня файла?

1 Ответ

0 голосов
/ 07 мая 2018

Номер инода родительского каталога корневого каталога равен 2, так же, как номер инода самого корневого каталога (и номера устройств одинаковы). По крайней мере, это верно для классических файловых систем Unix - и некоторых современных (вероятно, всех).

На моем Mac я могу запустить:

$ ls -lid /. /..
2 drwxr-xr-x  34 root  wheel  1088 Apr 25 07:55 /.
2 drwxr-xr-x  34 root  wheel  1088 Apr 25 07:55 /..
$

Обратите внимание, что корневой каталог (смонтированной) файловой системы также имеет индекс 2 на диске, но когда вы stat() корневая директория смонтированной файловой системы, вы получите другой индекс и номер устройства для родительского каталога. .

Например, на Mac снова смонтировано /private/var/vm/:

$ ls -lid /private/var /private/var/vm /private/var/vm/. /private/var/vm/..
13212009 drwxr-xr-x  26 root  wheel  832 Sep 26  2017 /private/var
       2 drwxr-xr-x   6 root  wheel  192 May  5 12:44 /private/var/vm
       2 drwxr-xr-x   6 root  wheel  192 May  5 12:44 /private/var/vm/.
13212009 drwxr-xr-x  26 root  wheel  832 Sep 26  2017 /private/var/vm/..
$

И с помощью пользовательской программы fstat вы можете увидеть, как меняются номера устройств:

$ fstat /private/var /private/var/vm /private/var/vm/. /private/var/vm/.. / /. /..
   Mode      Inode Links   UID   GID     Size    Modtime        Dev       RDev File
0040755   13212009    26     0     0      832 1506482024   16777223          0 /private/var
0040755          2     6     0     0      192 1525549483   16777221          0 /private/var/vm
0040755          2     6     0     0      192 1525549483   16777221          0 /private/var/vm/.
0040755   13212009    26     0     0      832 1506482024   16777223          0 /private/var/vm/..
0040755          2    34     0     0     1088 1524668138   16777223          0 /
0040755          2    34     0     0     1088 1524668138   16777223          0 /.
0040755          2    34     0     0     1088 1524668138   16777223          0 /..
$
Команды

GNU stat и BSD stat выдают одинаковую информацию о номере устройства, но их вывод более подробный и / или более нечитаемый.

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