Музыкальная шкатулка подручными средствами Andrushock Xakep, номер #062, стр. 062-110-1 (andrushock@real.xakep.ru) Нестандартное использование спулера печати Неумолимо приближается день очередной вечеринки. Чем на этой пати ты собираешься поразить воображение друзей и сердца подруг? Может, новым хранителем экрана? Очередной opengl'ной демкой? Наскоро написанным плагином для gkrellm? К сожалению, всем этим уже никого не удивишь. Тут нужно что-то сногсшибательное, и я попробую тебе помочь. Итак, сегодня на повестке дня тема только для самых настоящих никсанутых гиков - создание своеобразного музыкального автомата с помощью... системы печати. Держись крепче :). Изюминка шкатулки Все мы уже привыкли к километровым плейлистам и mp3-плееру, имеющему на борту не один десяток самых разных примочек. Со временем работа с музыкальными файлами превращается в настоящую рутину, но благодаря универсальности UNIX-like операционок и гибкости системы печати BSD можно внести новые идеи в процесс воспроизведения музыки. Собственно, кто нам мешает загружать в буфер печати не обычные документы, а, к примеру, mp3’шки? Не беспокойся, настоящий принтер нам не понадобится. Мы создадим виртуальное устройство печати, извергающее музон через программный фильтр. Все управление прослушиванием будет также осуществляться через систему печати. Песчинки истории Изначально система печати System V разрабатывалась без сетевой поддержки и была спроектирована таким образом, что внесение в ее структуру любых изменений становилось крайне сложной задачей для разработчиков. Именно поэтому операционные системы Free/Net/OpenBSD, а также подавляющее большинство Linux дистрибутивов в настоящее время используют систему печати BSD. Демон линейной печати lpd (Line Printer Daemon) представляет собой портированную версию исходного кода, написанного в университете Berkeley для BSD-версии операционной системы UNIX. Помимо одноименного демона, lpd состоит из целого набора программ для управления печатью: 1) lpr - постановка заданий в очередь; 2) lprm - удаление заданий из очереди; 3) lpq - просмотр очереди печати; 4) lpc - обеспечение полного контроля над lpd. Фильтруем базар /etc/printcap является главным конфигурационным файлом системы печати BSD. Стоит отметить, что его формат довольно специфичен: первой строкой идут разделенные вертикальной чертой имя, список псевдонимов и описание принтера, затем вся остальная информация в виде "двухсимвольная переменная=значение". Комментарии начинаются с решетки, параметры должны быть разделены между собой двоеточием, а обратный слеш служит для продолжения длинной строки и делает конфиг более наглядным. Printcap - это особая база данных, содержащая в себе около пятидесяти всевозможных элементов, однако для успешного выполнения нашей миссии мы обойдемся и девятью. Рассмотрим их подробнее: - переменная lp (:lp=/dev/null:) описывает имя устройства локального принтера. Так как реального принтера у нас нет, то указываем /dev/null. - переменная sd (:sd=/var/spool/lpd/audio:) определяет каталог спулинга. В идеале у каждого принтера должен быть собственный буфер печати для хранения лочащего, статусного и временных файлов, поэтому вручную создадим каталог, назначив ему соответствующие права доступа: |