My-library.info
Все категории

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Майкл Джонсон - Разработка приложений в среде Linux. Второе издание. Жанр: Программное обеспечение издательство -, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Разработка приложений в среде Linux. Второе издание
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
16 сентябрь 2019
Количество просмотров:
263
Читать онлайн
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - описание и краткое содержание, автор Майкл Джонсон, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.

Разработка приложений в среде Linux. Второе издание читать онлайн бесплатно

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон

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

char * buf;

int len = 50;


buf = malloc(len);

while (!getcwd(buf, len) && errno == ERANGE) {

 len += 50;

 buf = realloc(buf, len);

}

Как и многие другие Unix-подобные системы, Linux предоставляет полезное расширение POSIX-спецификации getcwd(). Если buf является NULL, функция распределяет буфер, размер которого достаточен для содержания текущего пути, с помощью нормального механизма malloc(). Несмотря на то что вызывающий код должен позаботиться о надлежащем освобождении памяти, используемой результатом, это расширение обеспечивает лучшую очистку, нежели цикл, как показано в предыдущем примере.

Функция BSD по имени getwd() является наиболее распространенной альтернативой getcwd(), но ее определенные дефекты привели к разработке getcwd().

#include <unistd.h>


char * getwd(char * buf);

Как и getcwd(), getwd() заполняет buf текущим путем, хотя функция не имеет представления о размере buf. getwd() никогда не записывает в буфер больше, чем PATH_MAX (определенная в <limits.h>), что позволяет программам избегать переполнения буферов, но не предоставляет программе механизма поиска правильного пути, если он превышает PATH_MAX байт[100]. Эта функция поддерживается Linux только для унаследованных приложений и не может использоваться новыми приложениями. Вместо этого применяйте правильную и более переносимую функцию getcwd().

Если для пользователей необходимо отображать текущий путь каталога, хорошим решением будет проверка переменной окружения PWD. Если она установлена, она содержит путь, который применяется пользователем и который может содержать символические ссылки на некоторые элементы пути. Этот путь обычно и должен отображаться приложением по желанию пользователя. Для облегчения задачи библиотека С в Linux предоставляет функцию get_current_dir_name(), реализуемую следующим образом.

char * get_current_dir_name() {

char * env = getenv("PWD");

if (env)

 return strdup(env);

else

 return getcwd(NULL, 0);

}

14.1.2. Специальные файлы . и ..

Каждый каталог, включая корневой, содержит также два специальных файла под именами . и .., полезные при определенных условиях. Первый, . — то же самое, что и текущий каталог. Это означает, что имена somefile и ./somefile эквивалентны.

Еще одно специальное имя файла, .., является родительским каталогом текущего каталога. В случае корневого каталога .. относится к самому корневому каталогу (поскольку у корневого каталога нет родительского каталога).

И ., и .. можно применять везде, где можно использовать имя каталога. Нормально то, что отношение символических ссылок к путям вроде ../include/mylib и именам файлов наподобие /./foo/.././bar/./fubar/../../usr/bin/less является законным (хотя эти названия довольно запутаны)[101].

14.1.3. Смена текущего каталога

Предусмотрено два системных вызова, меняющих текущий каталог процесса: chdir() и fchdir().

#include <unistd.h>


int chdir(const char * pathname);

int fchdir(int fd);

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

14.2. Смена корневого каталога

Хотя в системе имеется один корневой каталог, значение / может меняться для каждого процесса в системе. Это обычно делается для предотвращения доступа к файловой системе со стороны сомнительных процессов (например, демоны ftp, обрабатывающие запросы ненадежных пользователей). Например, если в качестве корневого каталога процесса определен /home/ftp, запуск chdir("/") сделает текущий каталог процесса /home/ftp, a getcwd() вернет / для поддержания последовательности данного процесса. С целью обеспечения безопасности, если процесс пытается выполнить chdir("/.."), он остается в своем каталоге / (каталог /home/ftp в масштабах всей системы), так же как и нормальные процессы, выполняющие chdir("/..") остаются в корневом каталоге в масштабах всей системы. Процесс может легко изменять свой текущий корневой каталог с помощью системного вызова chroot(). Но путь нового корневого каталога процесса интерпретируется с помощью текущего установленного корневого каталога, поэтому chroot("/") не модифицирует текущий корневой каталог процесса.

#include <unistd.h>


int chroot(const char * path);

Здесь path определяет новый корневой каталог для процесса. Этот системный вызов, однако, не изменяет текущий каталог процесса. У процесса все еще есть доступ к файлам в текущем каталоге, а также в родственном ему каталоге (../../directory/file). Большинство процессов, выполняющих chroot(), немедленно меняют свои текущие каталоги, чтобы находиться внутри новой корневой иерархии, с помощью chdir("/") или чего-либо подобного. Отмена этого действия может вызвать проблемы с безопасностью в некоторых приложениях.

14.3. Создание и удаление каталогов

14.3.1. Создание новых каталогов

Создание новых каталогов выполняется очень просто.

#include <fcntl.h>

#include <unistd.h>


int mkdir(const char * dirname, mode_t mode);

Путь, определенный в dirname, создается как новый каталог с полномочием mode (что модифицируется umask процесса). Если dirname определяет существующий файл, или некоторые элементы dirname не являются каталогом или символической ссылкой на него, системный вызов не удается.

14.3.2. Удаление каталогов

Удаление каталога — это практически то же, что и удаление файла; меняется разве что имя системного вызова.

#include <unistd.h>


int rmdir(char * pathname);

Для успешного выполнения rmdir() каталог должен быть пустым (он не должен содержать ничего, кроме вездесущих . и ..); в противном случае возвращается ENOTEMPTY.

14.4. Чтение содержимого каталога

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

#include <dirent.h>


DIR * opendir(const char * pathname);

int closedir(DIR * dir);

Системный вызов opendir() возвращает указатель на тип данных DIR, который является абстрактным (как и структура stdio по имени FILE) и которым не следует манипулировать вне библиотеки С. Поскольку каталоги можно открывать только для чтения, нет необходимости определять, в каком режиме открывается каталог, opendir() срабатывает только в случае существования каталога — этот вызов нельзя использовать для создания новых каталогов (для этого служит mkdir()). Закрытие каталога может не сработать только в случае некорректного значения аргумента dir.

После открытия каталога его элементы читаются последовательно до конца каталога.

Системный вызов readdir() возвращает имя следующего файла в каталоге. Каталоги не упорядочены каким-либо образом, поэтому не стоит предполагать, что оглавление каталога отсортировано. Если необходим упорядоченный список файлов, сортировку придется выполнять самостоятельно. Функция readdir() определяется, как показано ниже.

#include <dirent.h>


struct dirent * readdir (DIR * dir);

Вызывающему коду возвращается указатель на структуру struct dirent. Несмотря на то что struct dirent содержит несколько элементов, единственным переносимым элементом является d_name, содержащий имя файла элемента каталога. Остальные элементы struct dirent зависят от системы. Однако интересным является элемент d_ino, содержащий inode-номер файла.

Самой сложной частью этого процесса является определение ошибки. К сожалению, readdir() возвращает NULL, и когда происходит ошибка, и когда в каталоге больше нет элементов. Чтобы различать эти две ситуации, необходимо проверять errno. Эта задача усложняется тем, что readdir() не меняет errno, пока не произойдет ошибка. Это означает, что для корректной проверки ошибок errno необходимо установить перед вызовом readdir() в заранее известное значение (обычно 0). Ниже показана простая программа, записывающая имена файлов текущего каталога в stdout.


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


Разработка приложений в среде Linux. Второе издание отзывы

Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.