-->

Основы программирования в Linux

На нашем литературном портале можно бесплатно читать книгу Основы программирования в Linux, Мэтью Нейл-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Основы программирования в Linux
Название: Основы программирования в Linux
Дата добавления: 16 январь 2020
Количество просмотров: 669
Читать онлайн

Основы программирования в Linux читать книгу онлайн

Основы программирования в Linux - читать бесплатно онлайн , автор Мэтью Нейл
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 54 55 56 57 58 59 60 61 62 ... 324 ВПЕРЕД
Перейти на страницу:

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

Мы могли бы сделать программу более универсальной, принимая в качестве аргумента командной строки начальную точку просмотра.

Для того чтобы познакомиться с методами повышения универсальности программ, посмотрите исходный код таких утилит Linux, как

ls
и
find
.

Упражнение 3.4. Программа просмотра каталога

1. Начните с соответствующих заголовочных файлов и функции

printdir
, которая выводит содержимое текущего каталога. Она будет рекурсивно вызываться для вывода подкаталогов, применяя параметр
depth
для задания отступа.

#include <unistd.h>

#include <stdio.h>

#include <dirent.h>

#include <string.h>

#include <sys/stat.h>

#include <stdlib.h>

void printdir(char *dir, int depth) {

 DIR *dp;

 struct dirent *entry;

 struct stat statbuf;

 if ((dp = opendir(dir)) == NULL) {

  fprintf(stderr, "cannot open directory: %sn", dir);

  return;

 }

 chdir(dir);

 while((entry = readdir(dp)) != NULL) {

  lstat(entry->d_name, &statbuf);

  if (S_ISDIR(statbuf.st_mode)) {

   /* Находит каталог, но игнорирует . и .. */

   if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)

    continue;

   printf("%*s%s/n", depth, "", entry->d_name);

   /* Рекурсивный вызов с новый отступом */

   printdir(entry->d_name, depth+4);

  } else printf("%*s%sn", depth, " ", entry->d_name);

 }

 chdir("..");

 closedir(dp);

}

2. Теперь переходите к функции

main
.

int main() {

 /* Обзор каталога /home */

 printf("Directory scan of /home:n");

 printdir("/home", 0);

 printf("done.n");

 exit(0);

}

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

$ <b>./printdir</b>

Directory scan of /home:

neil/

    .Xdefaults

    .Xmodmap

    .Xresources

    .bash_history

    .bashrc

    .kde/

        share/

            apps/

                konqueror/

                    dirtree/

                        public_html.desktop

                    toolbar/

                        bookmarks.xml

                        konq_history

                    kdisplay/

                        color-schemes/

    BLP4e/

        Gnu_Public_License

        chapter04/

            argopt.с

            args.с

        chapter03/

            file.out

            mmap.с

            printdir

done.

Как это работает

Большинство операций сосредоточено в функции

printdir
. После некоторой начальной проверки ошибок с помощью функции
opendir
, проверяющей наличие каталога,
printdir
выполняет вызов функции
chdir
для заданного каталога. До тех пор пока элементы, возвращаемые функцией
readdir
, не нулевые, программа проверяет, не является ли очередной элемент каталогом. Если нет, она печатает элемент-файл с отступом, равным
depth
.

Если элемент — каталог, вы встречаетесь с рекурсией. После игнорирования элементов

.
и
..
(текущего и родительского каталогов) функция
printdir
вызывает саму себя и повторяет весь процесс снова. Как она выбирается из этих повторений? Как только цикл
while
заканчивается, вызов
chdir(&quot;..&quot;)
возвращает программу вверх по дереву каталогов, и предыдущий перечень можно продолжать. Вызов
closedir(dp)
гарантирует, что количество открытых потоков каталогов не больше того, которое должно быть.

Для того чтобы составить представление об окружении в системе Linux, обсуждаемом в главе 4, познакомьтесь с одним из способов, повышающих универсальность программы. Рассматриваемая программа ограничена, потому что привязана каталогу /home. Следующие изменения в функции

main
могли бы превратить эту программу в полезный обозреватель каталогов:

1 ... 54 55 56 57 58 59 60 61 62 ... 324 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название