Программирование для Linux. Профессиональный подход - [108]
Б.6. Чтение содержимого каталога
В Linux имеются функции, предназначенные для чтения содержимого каталога. И хотя они не относятся к низкоуровневым функциям, мы все же решили их описать, так как они широко применяются в программах.
При чтении содержимого каталога необходимо придерживаться такой последовательности действий.
1. Вызовите функцию >opendir()
, передав ей путевое имя требуемого каталога. Эта функция возвращает дескриптор типа >DIR*
, который можно использовать для доступа к содержимому каталога. В случае ошибки возвращается >NULL
.
2. Последовательно вызывайте функцию >readdir()
, передавая ей дескриптор, полученный от функции >opendir()
. Всякий раз функция >readdir()
будет возвращать указатель на структуру типа >dirent
, содержащую информацию о следующем элементе каталога. По достижении конца каталога будет получено значение >NULL
. У структуры >dirent
есть поле >d_name
, где содержится имя элемента каталога.
3. Вызовите функцию >closedir()
, передав ей имеющийся дескриптор, чтобы завершить сеанс работы с каталогом.
Для использования перечисленных функций необходимо включить в программу файлы >
и >
. Ответственность за сортировку содержимого каталога возлагается на программу.
В листинге Б.8 показана программа отображающая список содержимого каталога. Имя каталога задается в командной строке. Если этого не сделать, будет проанализирован текущий каталог. Для каждого элемента каталога отображается его тип и путевое имя. Функция >get_file_type()
определяет тип объекта файловой системы с помощью функции >lstat()
.
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>/* Эта функция возвращает строку с описанием типа объекта
> файловой системы, заданного в аргументе PATH. */
>const char* get_file_type(const char* path) {
> struct stat st;
> lstat(path, &st);
> if (S_ISLNK(st.st_mode))
> return "symbolic link";
> else if (S_ISDIR(st.st_mode))
> return "directory";
> else if (S_ISCHR(st.st_mode))
> return "character device";
> else if (S_ISBLK(st.st_mode))
> return "block device";
> else if (S_ISFIFO(st.st_mode))
> return "fifo";
> else if (S_ISSOCK(st.st_mode))
> return "socket";
> else if (S_ISREG(st.st_mode))
> return "regular file";
> else
> /* Нераспознанный тип. */
> assert(0);
>}
>int main(int argc, char* argv[]) {
> char* dir_path;
> DIR* dir;
> struct dirent* entry;
> char entry_path[PATH_MAX + 1];
> size_t path_len;
> if (argc >= 2)
> /* Если каталог указан в командной строке, анализируем его. */
> dir_path = argv[1];
> else
> /* В противном случае анализируем текущий каталог. */
> dir_path = ".";
> /* Копируем имя каталога в переменную entry_path. */
> strncpy(entry_path, dir_path, sizeof(entry_path));
> path_len = strlen(dir_path);
> /* Если имя каталога не заканчивается косой чертой,
> добавляем ее. */
> if (entry_path[path_len - 1] != '/') {
> entry_path[path_len] = '/';
> entry_path[path_len + 1] = '\0';
> ++path_len;
> }
> /* Начинаем обрабатывать список содержимого каталога. */
> dir = opendir(dir_path);
> /* просматриваем все элементы каталога. */
> while ((entry = readdir(dir)) != NULL) {
> const char* type;
> /* Формируем полное путевое имя элемента каталога. */
> strncpy(entry_path + path_len, entry->d_name,
> sizeof(entry_path) — path_len);
> /* Определяем тип элемента. */
> type = get_file_type(entry_path);
> /* Отображаем собранную информацию. */
> printf("%-18s: %s\n", type, entry_path);
> }
> /* Конец работы. */
> closedir(dir);
> return 0;
>}
Приведем несколько строк листинга полученного в каталоге >/dev
(в разных системах могут быть выданы разные результаты)
>% ./listdir /dev
>directory : /dev/.
>directory : /dev/..
>socket : /dev/log
>character device : /dev/null
>regular file : /dev/MAKEDEV
>fifo : /dev/initctl
>character device : /dev/agpgart
>...
Для проверки этих данных можно воспользоваться командой >ls
. Флаг >-U
отменяет сортировку списка, а флаг >-a
заставляет включить в список записи текущего (>.
) и родительского (>..
) каталогов.
>% ls -lua /dev total 124
>drwxr-xr-x 7 root root 36864 Feb 1 15:14 .
>drwxr-xr-x 22 root root 4096 Oct 11 16:39 ..
>srw-rw-rw- 1 root root 0 Dec 18 01:31 log
>crw-rw-rw- 1 root root 1, 3 May 5 1998 null
>-rwxr-xr-x 1 root root 26689 Mar 2 2000 MAKEDEV
>prw------- 1 root root 0 Dec 11 18:37 initctl
>crw-rw-r-- 1 root root 10, 175 Feb 3 2000 agpgart
Первый символ каждой строки определяет тип элемента каталога.
Приложение В
Таблица сигналов
В табл. В.1 перечислены сигналы, которые чаще всего приходится обрабатывать в Linux-программах. Некоторые сигналы имеют разные интерпретации в зависимости от того, где они были получены.
Указанные имена сигналов определены в виде макроконстант препроцессора. Чтобы иметь возможность сослаться на них в программе необходимо подключить файл >
. Реальное определение сигналов дано в файле >/usr/sys/signum.h
, который подключается к файлу >
.
Для получения полного списка сигналов, поддерживаемых в Linux, необходимо выполнить такую команду:
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.