Я понимаю, что каталог - это всего лишь файл в unix, который содержит номера inode и имена файлов внутри. Как я могу это взглянуть? Я не могу использовать cat или less в каталоге, и его открытие в vi просто показывает мне список файлов ... нет номеров inode.Как читать каталог как файл в Unix?
ответ
Поскольку это программирование вопрос (он является программирования вопрос, не так ли?), Вы должны проверить функции на 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
, такие вещи, как времена, размер, владелец, разрешения и т. Д., А также важные указатели на фактическое содержимое файла.
А, я вижу. Но есть ли способ увидеть буквальное, фактическое содержимое файла? Возможно, этот пример будет более ясным: в моей настройке я могу ввести «less/bin/ls», чтобы увидеть содержимое ls. Очевидно, это не разборчиво, но я все еще вижу это. Могу ли я сделать то же самое для каталогов? Это не практический вопрос, более того, мне любопытно, позволяет ли Unix делать что-то подобное. –
Я никогда не видел команду уровня пользователя, способную это сделать (это не значит, что она не существует).Однако, с небольшой работой, вы можете получить inode фактического каталога, который вас интересует (из родительского каталога), и пропустить фактические структуры на жестком диске, если у вас есть необходимые разрешения. – paxdiablo
Отлично, спасибо. Похоже, нет простого решения, но небольшой поисковый запрос показал, что есть некоторые функции C, которые стоит исследовать. –
Похоже, что возможно 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
Команда 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 –
statvfs() - более предпочтительная функция для использования в общей практике. –
В старые времена - версия 7, система III, ранняя система V - вы действительно можете открыть каталог и прочитать содержимое в памяти, особенно для старой файловой системы Unix с 2-байтовыми номерами inode и лимитом 14 байтов в имени файла.
Поскольку более экзотические файловые системы стали более распространенными, вместо них нужно было использовать семейство вызовов функций opendir(), readdir(), closedir(), поскольку разбор содержимого каталога стал все более нетривиальным.
Наконец, в последнее десятилетие или около того он достиг точки, где на большинстве систем вы не можете прочитать каталог; вы можете открыть его (в первую очередь, такие операции, как fchdir(), могут работать), и вы можете использовать семейство вызовов opendir() для его чтения.
Нет API для получения сырого содержимого каталогов. Однако для отладочной или образовательной цели вы можете использовать 'debugfs' (только для ext2 fs). Вы можете использовать 'debugfs -R 'dump_inode/your_dir tmpfile'/dev/sda1', за которым следует' hexdump -C tmpfile' – Jezz