C Программа для записи содержимого каталога - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно написать упрощенную версию программы ls на C. Она собирается перечислить все содержимое текущего каталога. При запуске он должен отображать тот же вывод, что и эта команда:

ls -alU --time-style=long-iso

Никакие аргументы не предоставлены программе. У меня проблемы с началом работы, но я знаю, что мне придется выполнять некоторые системные вызовы, такие как opendir (), readdir (), lstat () и getpwuid (). Любая помощь в получении меня от земли и в это очень ценится. Я тоже очень хочу это понять. Спасибо!

1 Ответ

2 голосов
/ 30 октября 2019

Работа в обратном направлении от выхода, поле за полем:

-rw-r--r--   1 kaz  kaz       3573 2018-06-07 13:59 .bashrc

Имя .bashrc происходит из readdir обхода.

Все, кроме имени, происходит от lstat системный вызов, вызванный для имени.

Тип -rw... и флаги представляются из st_mode, который необходимо декодировать в эту форму. Существуют макросы доступа, которые могут помочь, например S_ISDIR(mode), для проверки, является ли это каталогом, или (mode & S_IXUSR) != 0, чтобы проверить, является ли он исполняемым владельцем. 1 - это количество ссылок, st_nlink. kaz и kaz - это идентификаторы пользователей и групп, преобразованные в текст с использованием (например) getpwuid для получения struct passwd * и getgrgid для получения struct group * с полями имен. 3753 - это st_size. Вывод даты можно получить путем форматирования st_mtime с использованием функции strftime.

Форматирование в столбцы с отступами можно выполнить с помощью printf или sprintf, например: printf("<%-50s>", "this-is-left-aligned-in-50-col-field").

...