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

Здесь есть возможность читать онлайн «Майкл Джонсон - Разработка приложений в среде Linux. Второе издание» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: Вильямс, Жанр: ОС и Сети, Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

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

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Разработка приложений в среде Linux. Второе издание»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Разработка приложений в среде Linux. Второе издание», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

438: else

439: newdir = newJob.progs[0].argv[1];

440: if (chdir(newdir))

441: printf("сбой при смене текущего каталога: %s\n",

442: strerror(errno));

443: return 0;

444: } else if (!strcmp(newJob.progs[0].argv[0], "jobs")) {

445: for (job = jobList->head; job; job = job->next)

446: printf(JOB_STATUS_FORMAT, job->jobId, "Выполняется",

447: job -> text);

448: return 0;

449: }

14.6.2. Добавление универсализации файловых имен

Универсализацию файловых имен, при которой оболочка разворачивает символы *, []и ?в соответствующие файловые имена, в определенной мере сложно реализовать из-за разнообразных методов применения кавычек. Первая модификация заключается в построении каждого аргумента в виде строки, подходящей для передачи в glob(). Если символ универсализации помещен в кавычки, принятые в оболочке (например, двойные кавычки), тогда символу универсализации предшествует \с целью предотвращения его разворачивания в glob(). Этот процесс реализуется легко, хотя с первого взгляда может показаться сложным.

Две части синтаксического разбора команд в parseCommand() необходимо слегка изменить. Последовательности "и 'обрабатываются ближе к началу цикла, что обеспечивает разделение командной строки на аргументы. Если во время синтаксического разбора мы находимся в середине строки в кавычках и сталкиваемся с символом универсализации, мы заключаем его в кавычки с предваряющим символом \, что выглядит следующим образом.

189: } else if (quote) {

190: if (*src == '\\') {

191: src++;

192: if (!*src) {

193: fprintf(stderr,

194: "после \\ ожидался символ\n");

195: freeJob(job);

196: return 1;

197: }

198:

199: /* в оболочке "\'" должен дать \' */

200: if (* src ! = quote) *buf++ = '\\';

201: } else if (*src = '*' | | *src == '?' || *src == '[' ||

202: *src == ']')

203: *buf++ = '\\';

204: *buf++ = *src;

205: } else if (isspace(*src)) {

В код были добавлены только средний else ifи оператор присваивания в его теле. Похожий код потребуется предусмотреть для обработки символов \, встречающихся вне строк в кавычках. Это реализовано в конце главного цикла parseCommand(). Ниже приведен измененный код.

329: case '\\':

330: src++;

331: if (!*src) {

332: freeJob(job);

333: fprintf(stderr, "после \\ ожидался символ\n");

334: return 1;

335: }

336: if (* src == '*' || *srс == '[' | | *src == ']'

337: || *srс == '?')

338: *buf++ = '\\';

339: /* сквозная обработка */

340: default:

341: *buf++ = *src;

Для заключения знаков универсализации в кавычки здесь был добавлен тот же самый код.

Эти две кодовые последовательности обеспечивают передачу каждого аргумента в glob()без поиска неожиданных совпадений.

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

Для облегчения управления памяти к struct childProgramдобавляется элемент globResultтипа glob_t, используемый для хранения результатов всех операций универсализации. Кроме того, добавляется целочисленный элемент freeGlob, не равный нулю, если freeJob()должна освободить globResult. Ниже показано полное описание struct childProgramв ladsh3.c.

35: struct childProgram {

36: pid; /* 0, если завершена */

37: char ** argv; /* имя и аргументы программы */

38: int numRedirections; /* элементы в массиве перенаправлений */

39: struct redirection Specifier * redirections; /* перенаправления ввода-вывода */

40: glob_t globResult; /* результат универсализации параметров */

41: int freeGlob; /* нужно ли освобождать globResult? */

42: };

Во время первого запуска для командной строки функция globLastArgument()(когда argcдля текущей дочерней оболочки равно 1) инициализирует globResult. Для остальных аргументов она пользуется преимуществом GLOB_APPENDдля добавления новых совпадений к существующим. Это избавляет от необходимости распределения собственной памяти для целей универсализации, поскольку одиночный glob_tпри необходимости автоматически расширяется.

Если globLastArgument()не находит совпадений, символы \с кавычками удаляются из аргумента. В противном случае все новые совпадения копируются в список аргументов, создаваемый для дочерней программы.

Ниже приведена полная реализация globLastArgument(). Все сложные ее части относятся к управлению памятью; фактическая универсализация похожа на реализованную в программе globit.с, которая представлена ранее в главе.

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

Интервал:

Закладка:

Сделать

Похожие книги на «Разработка приложений в среде Linux. Второе издание»

Представляем Вашему вниманию похожие книги на «Разработка приложений в среде Linux. Второе издание» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Геше Джампа Тинлей - Лоджонг (второе издание)
Геше Джампа Тинлей
Алексей Филатов - Люди «А». Второе издание
Алексей Филатов
Отзывы о книге «Разработка приложений в среде Linux. Второе издание»

Обсуждение, отзывы о книге «Разработка приложений в среде Linux. Второе издание» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x