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

Интервал:

Закладка:

Сделать

Ядро Linux может быть скомпилировано без поддержки интерфейса Unix98, и можно встретить более старые системы без псевдотерминалов стиля Unix98, поэтому мы представим код, который пытается открыть псевдотерминалы стиля Unix98, но также может вернуться к интерфейсу BSD. (Мы не документируем части модели SysV, присущие STREAMS; в [35] подробно описан интерфейс STREAMS. Вам вряд ли понадобится код, специфичный для STREAMS; спецификация Unix98 не требует его.)

16.6.2. Простые способы открытия псевдотерминалов

В библиотеке libutilglibc предлагает две функции — openpty()и forkpty(), — выполняющие почти всю работу по поддержке псевдотерминалов.

#include

int openpty(int * masterfd, int * slavefd, char * name,

struct termios * term, struct winsize * winp);

int forkpty(int * masterfd, char * name,

struct termios * term, struct winsize * winp);

Функция openpty()открывает ведущие и подчиненные псевдотерминалы, необязательно используя структуры struct termiosи struct winsize, передаваемые как опции настройки псевдотерминала, возвращая 0в случае успеха и -1в случае ошибки. Файловые дескрипторы ведущего устройства и подчиненного компонента возвращаются аргументам masterfdи slavefdсоответственно. Аргументы termи winpмогут быть NULL, в случае чего они игнорируются, и настройка не выполняется.

Функция forkpty()работает так же, как и openpty(), но вместо возврата файлового дескриптора подчиненного компонента она разветвляет псевдотерминал как управляющий терминал stdin, stdout и stderr для дочернего процесса, а затем, подобно fork(), возвращает идентификатор дочернего процесса родительскому и 0 дочернему либо -1 при возникновении ошибки.

Даже с этими удобными интерфейсами связана значительная проблема: аргумент name был изначально предназначен для возврата имени устройства псевдотерминала вызывающему коду, но его использование небезопасно, поскольку openpty()и forkpty()не знают размера буфера. Всегда передавайте NULLв аргументе name. Используйте функцию ttyname(), описанную в начале этой главы, чтобы получить путевое имя файла устройства псевдотерминала.

Предпочтительный способ работы с struct termiosзаключается в использовании цикла чтение-модификация-запись, но данному случаю это не соответствует по двум причинам. Можно передать NULLи принять значения по умолчанию, что достаточно в большинстве случаев; а когда вы хотите предоставить настройки termios, вы часто заимствуете настройки у другого tty, или знаете точно, какими они должны быть (например, в случае концентратора последовательного порта SCSI, описанного ранее в этой главе).

tcgetattr(STDIN_FILENO, &term);

ioctl(STDIN_FILENO, TIOCGWINSZ, &ws);

pid = forkpty(&masterfd, NULL, &term, &ws);

16.6.3. Сложные способы открытия псевдотерминалов

Интерфейс Unix98 для распределения пары псевдотерминала представляет собой следующий набор функций.

#define _XOPEN_SOURCE 600

#include

#include

int posix_openpt(int oflag);

int grantpt(int fildes);

int unlockpt(int fildes);

char * ptsname(int fildes);

Функция posix_openpt()— это то же, что и открытие устройства /dev/ptmx, но теоретически она более переносима (поскольку везде принимается). Рекомендуется в этот раз использовать open("/dev/ptmx", oflag)для максимальной практической переносимости. Если вы хотите установить один или два флага open()или posix_openpt(), используйте O_RDWR, как обычно; если вы вместо этого не открываете управляющий tty для процесса, используйте O_RDWR | O_NOCTTY. open()или posix_openpt()вернет открытый файловый дескриптор управляющему устройству псевдотерминала. Затем вызовите grantpt()с файловым дескриптором управляющего устройства псевдотерминала, возвращенным из posix_openpt(), для изменения режима и владельца подчиненного компонента псевдотерминала, а потом — unlockpt(), чтобы сделать подчиненный компонент псевдотерминала доступным для открытия. Интерфейс Unix98 для открытия подчиненного устройства псевдотерминала должен просто открыть имя, возвращенное ptsname(). Все эти функции возвращают -1в случае ошибки, кроме ptsname(), возвращающей в такой ситуации NULL.

Функции в ptypair.cраспределяют согласованную пару устройств pty. Пример функции get_master_pty()в строке 22 ptypair.соткрывает управляющее устройство pty и возвращает файловый дескриптор родительскому процессу, а также предоставляет имя соответствующему подчиненному компоненту pty. Он сначала испытывает интерфейс Unix98 на распределение управляющего устройства pty, а если это не работает (например, если ядро скомпилировано без поддержки pty Unix98, возможно, для встроенных систем), возвращается к старому интерфейсу стиля BSD. Соответствующая функция get_slave_pty()в строке 87 может быть использована после fork()для открытия соответствующего подчиненного компонента pty.

1: /* ptypair.c */

2:

3: #define _XOPEN_SOURCE 600

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include

11: #include

12:

13:

14: /* get_master_pty() принимает дважды косвенный символьный указатель на

15: * место помещения имени подчиненного компонента pty и возвращает целочисленный

16: * файловый дескриптор. Если возвращается значение < 0, значит, возникла ошибка.

17: * В противном случае возвращается файловый дескриптор ведущего устройства pty

18: * и заполняет *name именем соответствующего подчиненного компонента pty. После

19: * открытия подчиненного компонента pty, вы отвечаете за освобождение *name.

20: */

21:

22: int get_master_pty(char **name) {

23: int i, j;

24: /* значение по умолчанию, соответствующее ошибке */

25: int master = -1;

26: char *slavename;

27:

28: master = open("/dev/ptmx", O_RDWR);

29: /* Это эквивалентно, хотя и более широко реализовано,

30: * но теоретически менее переносимо, следующему:

31: * master = posix_openpt(O_RDWR);

32: */

33:

34: if (master >= 0 && grantpt(master) >= 0 &&

3 5: unlockpt(master) >= 0) {

36: slavename = ptsname(master);

37: if (!slavename) {

38: close(master);

39: master = -1;

40: /* сквозной проход для нейтрализации ошибки */

41: } else {

42: *name = strdup(slavename);

43: return master;

44: }

45: }

46:

47: /* Остаток этой функции — нейтрализация ошибки для старых систем */

48:

49: /* создать фиктивное имя для заполнения */

50: *name = strdup("/dev/ptyXX");

51:

52: /* искать неиспользуемый pty */

53: for (i=0; i<16 && master <= 0; i++) {

54: for (j = 0; j<16 && master <= 0; j++) {

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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