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


Авторские права

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

Здесь можно скачать бесплатно "Майкл Джонсон - Разработка приложений в среде Linux. Второе издание" в формате fb2, epub, txt, doc, pdf. Жанр: Программное обеспечение, издательство Вильямс, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
Рейтинг:
Название:
Разработка приложений в среде Linux. Второе издание
Издательство:
Вильямс
Год:
2007
ISBN:
978-5-8459-1143-8
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

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

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



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

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






struct vt_stat {

 unsigned short v_active;

 unsigned short v_signal;

 unsigned short v_state;

};

• Переменная v_active хранит количество VC, активных в данный момент.

• Переменная v_signal не реализована.

• Переменная v_state хранит битовую маску, сообщающую, какие из первых 16 VC открыты в данный момент (в системе Linux поддерживается до 63 VC). В системе Linux редко появляется смысл консультироваться с данной маской, поскольку она недостаточно велика, чтобы содержать полную информацию. В большинстве случаев вам понадобится знать только номера ряда открытых консолей, которые вы можете извлечь с помощью функции VT_OPENQRY (рассматривается далее в этой главе).

20.2. Выдача звукового сигнала

Заставить консоль генерировать звуковой сигнал в течение определенного периода времени на указанной частоте совсем не сложное дело. Для этого существуют два способа. Первый состоит во включении или отключении постоянной тональной посылки. Команда KIOCSOUND отключает звук, если ее аргумент равен нулю. В противном случае она устанавливает частоту звука (причем довольно необычным способом, как показано в следующем коде).

void turn_tone_on(int fd, int hertz) {

 ioctl(fd, KIOCSOUND, 1193180/hertz)

}

void turn_tone_off(int fd) {

 ioctl(fd, KIOCSOUND, 0)

}

Вторым вариантом для выдачи консолью звукового сигнала является применение команды управления вводом-выводом KDMKTONE. Она включает тональную посылку на время, указанное в тиках системных часов (jiffy). К сожалению, время одного тика в различных архитектурах разное. Макрос HZ, определенный sys/param.h, позволяет получить количество тиков в секунду. Функция tone(), показанная ниже, демонстрирует, как извлекать количество тиков в сотых долях секунды и значение макроса HZ[151].

#include <sys/param.h>


void tone(int fd, int hertz, int hundredths) {

 unsigned int ticks = hundredths * HZ / 100;

 /* ticks & 0xffff не будет работать, если ticks — 0xf0000;

  * вместо этого нужно округлить до наибольшего допустимого значения */

 if (ticks > 0xffff) ticks = 0xffff;

 /* еще одна ошибка округления */

 if (hundredths && ticks == 0) ticks = 1;

 ioctl(fd, KDMKTONE, (ticks << 16 | (1193180/hertz)));

}

20.3. Определение, является ли терминал виртуальной консолью

Для того чтобы определить, является ли текущий терминал виртуальной консолью, можно открыть /dev/tty и применить VT_GETMODE для запроса режима:

struct vt_mode vtmode;

fd = open("/dev/tty", O_RDWR);

retval = ioctl (fd, VT_GETMODE, &vtmode);

if (retval < 0) {

 /* Данный терминал не является VC; выполните соответствующие действия */

}

20.4. Поиск текущей виртуальной консоли

Для извлечения номера текущей VC применяется команда управления вводом-выводом VT_GETSTATE, которая принимает указатель на структуру struct vt_stat и возвращает номер текущей консоли в ее элементе v_active.

unsigned short get_current_vc(int fd) {

 struct vt_stat vs;

 ioctl(fd, VT_GETSTATE, &vs);

 return(vs.v_active);

}

Для локализации соответствующего элемента устройства для текущей VC служит следующая функция:

sprintf(ttyname, "/dev/tty%d", get_current_vc(fd));

20.5. Управление переключением виртуальных консолей

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

retcode = ioctl(fd, VT_OPENQRY, &vtnum);

if ((retcode < 0) || (vtnum == -1)) {

 perror("myapp: нет доступных виртуальных терминалов");

 /* выполнить соответствующее действие */

}

Если в настоящее время используется менее 63 VC, и все из них заняты, то ядро автоматически выделяет память для новой VC[152].

Для запуска переключения на другую VC (например, на ту свободную консоль, которую вы только что обнаружили) используется команда управления вводом-выводом VT_ACTIVATE. Если нужно подождать до тех пор, пока консоль не станет активной, применяется команда VT_WAITACTIVE. Смена консоли может занять некоторое время, возможно, несколько секунд. Это объясняется тем, что активизируемая консоль может находиться в графическом режиме, при этом содержимое экрана нужно реконструировать из памяти, выбрать из буфера обмена или восстановить каким-то другим способом, отнимающим немало времени[153].

ioctl(fd, VT_ACТIVATE, vtnum);

ioctl(fd, VT_WAITACTIVE, vtnum);

Для осуществления контроля над переключениями VC или для получения уведомлений о подобных переключениях необходимо предусмотреть надежные обработчики сигналов с sigaction, как обсуждалось в главе 12. Здесь мы применяем SIGUSR1 и SIGUSR2; если нужно, вы можете использовать любые другие два сигнала, которые не предназначены для других целей (например, SIGPROF и SIGURG). Просто убедитесь, что выбранные вами сигналы удовлетворяют перечисленным ниже критериям.

• Они не требуются остальным системным функциям, особенно это касается тех сигналов, которые не могут быть перехвачены или проигнорированы.

• Они нигде не используются в вашем приложении для других целей.

• Они не представляют один и тот же сигнальный номер с двумя различными именами, как SIGPOLL и SIGIO (определения смотрите в /usr/include/asm/signal.h, либо ограничьте себя использованием сигналов из табл. 12.1).

void relsig(int signo) {

 /* выполнить соответствующее действие для освобождения VC */

}


void acqsig(int signo) {

 /* выполнить соответствующее действие для запроса VC */

}


void setup_signals(void) { struct sigaction sact;

 /* He маскировать никаких сигналов в то время,

  * когда активизированы данные обработчики. */

 sigemptyset(&sact.sa_mask);

 /* Здесь может понадобиться добавление вызовов sigaddset(),

  * если существуют сигналы, которые нужно маскировать

  * при переключении VC. */

 sact.flags = 0;

 sact.sa_handler = relsig;

 sigaction(SIGUSR1, &sact, NULL);

 sact.sa_handler = acqsig;

 sigaction(SIGUSR2, &sact, NULL);

}

После этого потребуется изменить стандартный режим VC (mode) с VT_AUTO на VT_PROGRESS, пока консоль уведомляется об обработчиках сигналов путем установки relsig и acqsig.

void control_vc_switching(int fd) {

 struct vt_mode vtmode;

 vtmode.mode = VT_PROCESS;

 vtmode.waitv = 1;

 vtmode.relsig = SIGUSR1;

 vtmode.acqsig = SIGUSR2;

 vtmode.frsig = 0;

 ioctl(fd, VT_SETMODE, &vtmode);

}

Обработчики сигналов, которые вызываются тогда, когда консоль находится в режиме VT_PROCESS, не должны соглашаться на переключение. Говоря более точно, обработчик relsig может отклонить разрешение на переключение VC. Обработчик acqsig, как правило, управляет процессом передачи консоли, но существует вероятность того, что он инициирует переключение на другую консоль. Будьте внимательны при кодировании обработчиков сигналов, чтобы избежать вызова любых нереентерабельных библиотечных функций. POSIX.1 устанавливает, что функции, перечисленные в табл. 12.2, являются реентерабельными. Значит, вы должны считать все остальные функции нереентерабельными, особенно, если хотите написать переносимую программу. Обратите внимание, в частности, на то, что malloc() и printf() являются нереентерабельными.

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

void relsig (int signo) {

 if (change_vc_ok()) {

  /* Разрешено переключение VC */

  save_state();

  ioctl(fd, VT_RELDISP, 1);

 } else {

  /* Запрещено переключение VC */

  ioctl(fd, VT_RELDISP, 0);

 }

}


void acqsig (int signo) {

 restore_state();

 ioctl(fd, VT_RELDISP, VT_ACKACQ);

}

Теперь вы в состоянии реализовать код функций change_vc_ok(), save_state() и restore_state().

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

ioctl(fd, VT_DISALLOCATE, vtnum);


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

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

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


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

Все книги автора Майкл Джонсон

Майкл Джонсон - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

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

А что Вы думаете о книге? Оставьте Ваш отзыв.