2009-11-02 2 views
1

Я понимаю, что каталог - это всего лишь файл в unix, который содержит номера inode и имена файлов внутри. Как я могу это взглянуть? Я не могу использовать cat или less в каталоге, и его открытие в vi просто показывает мне список файлов ... нет номеров inode.Как читать каталог как файл в Unix?

+0

Нет API для получения сырого содержимого каталогов. Однако для отладочной или образовательной цели вы можете использовать 'debugfs' (только для ext2 fs). Вы можете использовать 'debugfs -R 'dump_inode/your_dir tmpfile'/dev/sda1', за которым следует' hexdump -C tmpfile' – Jezz

ответ

7

Поскольку это программирование вопрос (он является программирования вопрос, не так ли?), Вы должны проверить функции на opendir, readdir и closedir. Они являются частью спецификации Single UNIX.

#include <sys/types.h> 
#include <dirent.h> 

DIR *opendir (const char *dirname); 
struct dirent *readdir(DIR *dirp); 
int closedir(DIR *dirp); 

Файл dirent.h должен иметь структуру, что вам нужно, содержащий по меньшей мере:

char d_name[] name of entry 
ino_t d_ino  file serial number 

См here для readdir страницы руководства - оно содержит ссылки на другие.

Имейте в виду, что объем информации о файле, хранящемся в записях каталога, минимален. Сам inode содержит материал, который вы получаете от функции stat, такие вещи, как времена, размер, владелец, разрешения и т. Д., А также важные указатели на фактическое содержимое файла.

+0

А, я вижу. Но есть ли способ увидеть буквальное, фактическое содержимое файла? Возможно, этот пример будет более ясным: в моей настройке я могу ввести «less/bin/ls», чтобы увидеть содержимое ls. Очевидно, это не разборчиво, но я все еще вижу это. Могу ли я сделать то же самое для каталогов? Это не практический вопрос, более того, мне любопытно, позволяет ли Unix делать что-то подобное. –

+1

Я никогда не видел команду уровня пользователя, способную это сделать (это не значит, что она не существует).Однако, с небольшой работой, вы можете получить inode фактического каталога, который вас интересует (из родительского каталога), и пропустить фактические структуры на жестком диске, если у вас есть необходимые разрешения. – paxdiablo

+0

Отлично, спасибо. Похоже, нет простого решения, но небольшой поисковый запрос показал, что есть некоторые функции C, которые стоит исследовать. –

1

Похоже, что возможно stat command. Из статьи:

stat /etc/passwd 

    File: `/etc/passwd' 
    Size: 2911    Blocks: 8 IO Block: 4096 regular file 
    Device: fd00h/64768d  Inode: 324438 Links: 1 
    Access: (0644/-rw-r--r--) Uid: (0/ root) Gid: (0/ root) 
    Access: 2008-08-11 05:24:17.000000000 -0400 
    Modify: 2008-08-03 05:11:05.000000000 -0400 
    Change: 2008-08-03 05:11:05.000000000 -0400 
+0

Команда stat предоставляет базовую информацию о файле или каталоге, но она ничего мне не говорит о файлы внутри. Например, использование «stat» в каталоге, на которое указывает/etc, дает мне: 234881026 2995 drwxr-xr-x 91 корневое колесо 0 3094 «окт. 29 11:27:39 2009» «26 сен 23:09:45 2009 "" 26 сентября 23:09:45 2009 "4096 0 0/private/etc –

+0

statvfs() - более предпочтительная функция для использования в общей практике. –

6

В старые времена - версия 7, система III, ранняя система V - вы действительно можете открыть каталог и прочитать содержимое в памяти, особенно для старой файловой системы Unix с 2-байтовыми номерами inode и лимитом 14 байтов в имени файла.

Поскольку более экзотические файловые системы стали более распространенными, вместо них нужно было использовать семейство вызовов функций opendir(), readdir(), closedir(), поскольку разбор содержимого каталога стал все более нетривиальным.

Наконец, в последнее десятилетие или около того он достиг точки, где на большинстве систем вы не можете прочитать каталог; вы можете открыть его (в первую очередь, такие операции, как fchdir(), могут работать), и вы можете использовать семейство вызовов opendir() для его чтения.