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

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

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

Интервал:

Закладка:

Сделать

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

#include

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.

1: /* dircontents.с */

2:

3: #include

4: #include

5: #include

6:

7: int main(void) {

8: DIR * dir;

9: struct dirent * ent;

10:

11: /* "." - текущий каталог */

12: if (!(dir = opendir("."))) {

13: perror("opendir");

14: return 1;

15: }

16:

17: /* установить errno в 0, чтобы можно было выяснить, когда readdir() даст сбой*/

18: errno = 0;

19: while ((ent = readdir(dir))) {

20: puts (ent->d_name);

21: /* сбросить errno, поскольку puts() может модифицировать ее */

22: errno = 0;

23: }

24:

25: if (errno) {

26: perror("readdir");

27: return 1;

28: }

29:

30: closedir(dir);

31:

32: return 0;

33: }

14.4.1. Прохождение по каталогу

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

#include

int rewinddir(DIR * dir);

14.5. Универсализация файловых имен

Большинство пользователей Linux принимают как должное то, что запуск ls *.сне сообщает сведения о файле в текущем каталоге, именем которого является *.с. Вместо этого они ожидают увидеть список всех файлов в текущем каталоге, имена которых заканчиваются на . Это расширение имени файла от *.сдо ladsh.с dircontents.с(например) обычно обрабатывается оболочкой, которая универсализирует все параметры для программ, выполняющихся под ее управлением. Программы, помогающие пользователям манипулировать файлами, тоже часто нуждаются в универсализации файловых имен. Существуют два распространенных способа универсализации имен файлов внутри программ.

14.5.1. Использование подпроцесса

Самый старый метод универсализации предусматривает запуск оболочки в качестве дочернего процесса и указание ей универсализировать файловые имена. Стандартная функция popen()(см. главу 10) упрощает этот метод — просто запустите команду ls *.сс помощью popen()и прочитайте результат. Этот подход может показаться несколько упрощенным, но все же он обеспечивает переносимое решение проблемы универсализации (вот почему приложения вроде Perl используют его).

Ниже приведена программа, которая универсализирует все аргументы и отображает все совпадения.

1: /* popenglob.c */

2:

3: #include

4: #include

5: #include

6: #include

7:

8: int main(int argc, const char ** argv)

9: char buf[1024];

10: FILE * ls;

11: int result;

12: int i;

13:

14: strcpy(buf, "ls");

15:

16: for (i = 1; i < argc; i++) {

17: strcat(buf, argv[i]);

18: strcat(buf, " ");

19: }

20:

21: ls = popen(buf, "r");

22: if (!ls) {

23: perror("popen");

24: return 1;

25: }

26:

27: while (fgets(buf, sizeof(buf), ls))

28: printf("%s", buf);

29:

30: result = pclose(ls);

31:

32: if (!WIFEXITED(result)) return 1;

33:

34: return 0;

35: }

14.5.2. Внутренняя универсализация

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

#include

int glob(const char * pattern, int flags,

int (*errfunc)(const char * epath, int eerrno), glob_t* pglob);

Первый параметр, pattern, определяет шаблон, которому должны соответствовать имена файлов. В нем допускается применение операций универсализации *, ?и [], а также необязательно {, }и ~которые трактуются так же, как в стандартных оболочках. Последний параметр указывает на структуру, которая заполняется результатами универсализации. Эта структура определена следующим образом.

#include

typedef struct {

int gl_pathc; /* количество путей в gl_pathv */

char **gl_pathv; /* список gl_pathc, соответствующих именам путей */

int gl_offs; /* пространство, зарезервированное в gl_pathv для GLOB_DOOFFS*/

} glob_t;

flags— это одно или несколько перечисленных ниже значений, объединенных с помощью битового "ИЛИ".

GLOB_ERR Возвращается в случае ошибки (если функция не может прочесть оглавление каталога, например, из-за проблем с доступом).
GLOB_MARK Если шаблон соответствует имени каталога, при возврате к этому имени будет добавлен символ /.
GLOB_NOSORT Обычно возвращаемые имена путей сортируются в алфавитном порядке. Если этот флаг установлен, они не сортируются.
GLOB_DOOFFS При установке первые строки pglob->gl_offsв возвращаемом списке имен путей оставляются пустыми. Это позволяет использовать glob()во время выстраивания ряда аргументов, которые будут переданы прямо в execv().
GLOB_NOCHECK Если ни одно из файловых имен не соответствует шаблону, в качестве единственного совпадения возвращается сам шаблон (обычно не возвращается ни одного совпадения). В обоих случаях шаблон возвращается, если он не содержит операций универсализации.
GLOB_APPEND pglobпредположительно является действительным результатом предыдущего вызова glob(), и любые результаты этого вызова добавляются к результатам предыдущего вызова. Это облегчает универсализацию множества шаблонов.
GLOB_NOESCAPE Обычно если операции универсализации предшествует символ \, она воспринимается как обычный символ. Например, шаблон а\*обычно соответствует только файлу по имени а*. Если устанавливается GLOB_NOESCAPE, символ \теряет свое особое значение, aa\*соответствует любому имени файла, начинающемуся с символов а\. В таком случае имена а\.и a\bcdбудут соответствовать, но arachnid — нет, поскольку оно не содержит \.
GLOB_PERIOD Большинство оболочек не позволяют применять операции универсализации для файловых имен, начинающихся с .(запустите ls *в своем домашнем каталоге и сравните полученное с результатом ls - а .). Функция glob()обычно ведет себя подобным образом, но GLOB_PERIODпозволяет операциям универсализации работать с ведущим символом. Значение GLOB_PERIODв POSIX не определено.
GLOB_BRACE Многие оболочки (следуя примеру csh) разворачивают последовательности с фигурными скобками как альтернативы; например, шаблон {a, b}разворачивается до a b, а шаблон a {, b, c}— до a ab ас. GLOB_BRACEделает возможным такое поведение. Значение GLOB_BRACEв POSIX не определено.
GLOB_NOMAGIС Действует подобно GLOB_NOCHECKза исключением того, что он добавляет шаблон к списку результатов только в том случае, если она не содержит специальных знаков. Значение GLOB_NOMAGICв POSIX не определено.
GLOB_TILDE Включает расширение с тильдой, в котором ~или подстрока ~/разворачиваются до пути к домашнему каталогу текущего пользователя, а ~user — до пути к домашнему каталогу пользователя user. Значение GLOB_TILDEв POSIX не определено.
GLOB_ONLYDIR Совпадает только с каталогами, а не с другими типами файлов. Значение GLOB_ONLYDIRв POSIX не определено.

Часто glob()наталкивается на каталоги, к которым у процесса нет доступа, что вызывает ошибки. Хотя ошибку можно каким-то образом обработать, однако если glob()возвращает ошибку ( GLOB_ERR), операцию универсализации нельзя перезапустить там, где предыдущая операция универсализации столкнулась с ошибкой. Поскольку сложно одновременно устранять ошибки, происходящие во время выполнения glob(), и завершать универсализацию, glob()позволяет передать ошибку в специально предусмотренную для этого функцию, которая определяется в третьем параметре glob().

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


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

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




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


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x