close

Вход

Забыли?

вход по аккаунту

?

kursovaya OS

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Санкт-Петербургский государственный политехнический университет"
Факультет управления и информационных технологий
Курсовая работа
Дисциплина: Операционные системы и оболочки
Тема: Linux. Разработка приложений.
специальность: 010503 "Математическое обеспечение и администрирование информационных систем"
Выполнил: Костоусов С.А.
Подпись______________ Преподаватель: Кетов Д. В.
Подпись______________ "____" ____________ 2012 г. Санкт-Петербург
2012
Оглавление
Обзор предмета3
Постановка задачи3
Решение4
Общие сведения о запуске4
Запуск программы 1led.c5
Запуск программы 2cd.c5
Запуск программы 3musicbox.c5
Тестирование6
Анализ результатов7
Источники7
Приложение8
Обзор предмета
Курс "Операционные системы и оболочки" рассчитан на ознакомление с основным инструментарием и возможностями различных операционных систем, в частности подробное ознакомление с семействами Windows и Linux.
Помимо теоретического материала, включающего в себя подробное рассмотрение истории развития операционных систем, их структуры, особенностей реализации и т.д., было сделано 7 лабораторных работ, целью которых было непосредственное ознакомление с инструментарием и внутренним устройством операционных систем упомянутых выше семейств.
Итогом курса стала курсовая работа, состоящая в разработке трёх приложения для системы семейства Linux, используя такой язык программирования, как С++.
Постановка задачи
Целью данной работы была выработка навыков программирования с использованием терминала в Unix подобных системах.
Для осуществления данной цели были поставлены следующие задачи:
- Установить на персональном компьютере одни из Unix подобных систем;
- Написать приложение для Linux, управляющее светодиодами клавиатуры CAPS, SCROLL, NUM lock через драйвер консоли tty(4) и реализующее новогоднюю гирлянду в нескольких режимах работы: бегущие огни, случайное мерцание, цветомузыка;
- Написать приложение для Linux, управляющее лотком CD-привода через драйвер cdrom и реализующее несколько новогодних танцев из балета 'Щелкунчик': танец феи Драже, вальс Цветов;
- Написать приложение для Linux, управляющее встроенной пищалкой через драйвер pcspkr и реализующее несколько незамысловатых звуковых эффектов: сирену, барабанную дробь.
Решение
Для выполнения поставленных целей была выбрана операционная система Ubuntu 12.10. С помощью программы LinuxLive USB Creator 2.8.18 была создана загрузочный flash-накопитель, с которого велась установка новой операционной системы. После изменения настроек приоритета Boot в BIOS, была произведена установка Ubuntu параллельно с уже установленной Windows (которая после всего выше описанного перестала грузиться).
Имея среду разработки, были написаны следующие программы 1led.c, 2cd.c, 3musicbox.c.
Общие сведения о запуске
Для запуска программ выполним следующие операции:
1. Открытие терминала (можно воспользоваться Ctrl + Alt + T);
2. Для проверки файла можем воспользоваться:
ls (Выводит список файлов и каталогов по порядку, можем использовать для проверки наличия файла в данной директории);
nano (вызов редактор в терминале).
3. Необходимо запустить стандартный компилятор, для этого вводим команду:
gcc -o program_name program_name.c, где:
gcc (или cc) - компилятор С;
-о - параметр для записи результата в файл;
program_name - имя будущего исполняемого файла;
program_name.c - исходный файл с нашей программой.
Для удобства файл программы следует хранить в директории ~/bin внутри директории /Home. Это позволит запускать программу из любой текущей директории. Создать её можно с помощью "mkdir".
4. Запуск осуществляется с помошью команды
sudo ./program_name *parameters*, где
sudo - режим суперпользователя, команда потребует ввода пароля;
./program_name - директория и имя исполняемого файла;
*parameters* - перечисление возможных параметров программы.
5. Получение результата программы.
Рис. 1. Иллюстрация корректности компиляции всех 3-х программ и получение 3-х исполняемых файлов. Запуск программы 1led.c
sudo ./led 1
Программа работает в режиме "1" - поочерёдное мигание каждого из светодиодов создает эффект гирлянды. Для этого реализован цикл из 3 итераций для того, чтобы функции ioctl(fd,KDSETLED,LED[j]) в качестве параметра передавать поочерёдно из массива идентификатор каждого из светодиодов. Мигание представляет собой включение и отключение (ioctl(fd,KDSETLED,0)) светодиодов через некоторые интервалы времени. Программа совершает 25 итераций, после чего мы вновь можем обращаться к терминалу.
sudo ./led 2
Программа работает в режиме "2" - случайное мигание одного из светодиодов. Генерация случайного значение происходит таким образом: ioctl(fd,KDSETLED,LED[rand()%3]). Программа совершает 25 итераций, после чего мы вновь можем обращаться к терминалу.
sudo ./1keydoardLED ???
При неверном вводе параметров будет выдано сообщение об ошибки, после чего мы вновь можем обращаться к терминалу.
Запуск программы 2cd.c
sudo ./cd
В данном случае запуск производится без параметров. Благодаря функциям открытия дисковода (ioctl(fd,CDROMEJECT,0)) и его закрытия (ioctl(fd,CDROMCLOSETRAY,0)) реализуется подобие "танца" под саундтрек к фильму "Звездные Войны".
Запуск программы 3musicbox.c
sudo modprobe pcspkr
sudo ./ music
Перед запуском программы необходимо включить pcspkr - спикер персонального компьютера. После запуска программы воспроизводятся мелодии, определяемые параметрами:
1 - эффект сирены (нарастание и убывание частоты звучание спикера)
2 - эффект барабанной дроби
3 - воспроизведение композиции "В лесу родилась ёлочка".
Изначально мы тестировали мелодии в Windows MVS с помощью функции beep. Затем мы преобразовали из 10-ой системы (с которой работает beep) счисления в 16-ую (в ней формируются системные вызовы) с помощью такой операции: 1193180/frequency. Где было возможно, мы явно преобразовывали в 16-ую систему счисления. Также продолжительность для вызовов терминала пришлось увеличить, умножив на 1000. Подобное решение было взято, после прочтения следующего форума: http://ubuntuforums.org/showthread.php?t=873679.
Тестирование
В первую очередь тестирование проводилось путём обычного запуска программ. Все три программы корректно запускаются и выполняются.
Также использовался трассировщик:
sudo strace program_name
Рис. 2. Часть данных, полученных после трассировки первой программы.
Как мы видим, в ходе исполнения первой программы, сначала открывается файловый дескриптор1, значение которого равно 3, то есть неотрицательно, а значит корректно. Далее strcmp - проверка параметров, ioctl - системные вызовы функций с идентификатором 19250 и параметром в 16-ой системе счисления. Все описанные функции вернули 0, что гарантирует корректность их работы.
Для второй программы можно увидеть следующее: сначала запускается музыка, затем открывается дисковод, потом воспроизводится фрагмент емлодии, затем дисковод закрывается и так далее.
Третья программа также корректно работает во всех 3-х режимах.
Для эксперимента программа также запускалась на компьютере, без функции закрытия cd лотка и без драйвера для спикера. Были получены следующие результаты:
Рис. 3. Часть данных, полученных после трассировки второй программы на компьютере, без функции закрытия cd лотка и без драйвера для спикера.
Видно, что в случаях обращения к несуществующим функциям, возвращается -1, после чего программа выполняется дальше. При отсутствии драйвера программа не находит устройство (что вполне логично). При обращении к драйверу с несуществующей функцией, системы выдаёт ошибку ввода-вывода, что тоже логично.
Анализ результатов
Была успешно установлена операционная система Ubuntu семейства Linux.
Были разработаны 3 приложения, каждое из которых работает. Нами были закреплены навыки использования терминала для управления персональным компьютером, как то:
- использование стандартных команд;
- написание своих программ, в частности во встроенном редакторе, их сборка и отладка;
- тестирование команд с помощью стандартных средств, изучений обращений программ к уже готовым функциям, драйверам и библиотекам.
Источники
1. http://ubuntu.ru/
2. http://lxr.linux.no/linux/
3. http://www.linuxmanpages.com/man4/console.4.php 4. http://www.linuxmanpages.com/man4/console_ioctl.4.php
5. http://lxr.linux.no/linux+v3.6.6/Documentation/ioctl/cdrom.txt#L251
6. http://lxr.linux.no/linux+v3.6.6/Documentation/ioctl/cdrom.txt#L270
7. http://ru.wikipedia.org/wiki/%D0%A9%D0%B5%D0%BB%D0%BA%D1%83%D0%BD%D1%87%D0%B8%D0%BA
8. http://ru.wikipedia.org/wiki/%D4%E0%E9%EB%EE%E2%FB%E9_%E4%E5%F1%EA%F0%E8%EF%F2%EE%F0
9. http://ubuntuforums.org/showthread.php?t=873679
10. man - (manual) - команда вызова справки через терминал (manual)
Приложение
1. Программа 1led.c
#include <stdio.h>
int main( int argc , char *argv[])
{
int fd = 0;
char leds;
int i=0;
char LED[] = {LED_NUM,LED_CAP,LED_SCR};
int inter = 0;
fd = open("/dev/console",O_RDWR);
if(fd<0) {
perror("open(/dev/console)");
return 1; }
ioctl(fd,KDGETLED, &leds);
if (argc != 2)
{
printf("%s\n","Error. Rewrite parametrs!");
return 2;
}
if(strcmp(argv[1],"1")==0)
{
int j=0;
for(i=0;i<25;i++)
{
for(j=0;j<3;j++)
{
ioctl(fd,KDSETLED,0);
ioctl(fd,KDSETLED,LED[j]);
usleep(100000);
} }
} if(strcmp(argv[1],"2")==0)
{
for(i=0;i<25;i++)
{
ioctl(fd,KDSETLED,0);
ioctl(fd,KDSETLED,LED[rand()%3]);
usleep(100000);
} }
close(fd);
return 0;}
2. Программа 2cd.c
#include <stdio.h>
#include <signal.h>
#include <linux/kd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main(int argc, char* argv[])
{
int fd;
int i =0;
int frequency[]={300,0,300,0,300,0,250,0,350,300,0,250,0,350,300,0};
int duration[]={500,50,500,50,500,50,500,50,250,500,50,500,50,250,500,50};
fd = open("/dev/sr0", O_RDWR|O_NONBLOCK);
if(fd<0) {
perror("open(/dev/cdrom)");
return 1; }
for(i=0;i<16;i++)
{if((i==0)||(i==8)) {ioctl(fd,CDROMEJECT,0);}
if((i==5)||(i==13)) {ioctl(fd,CDROMCLOSETRAY,0);}
if(frequency[i]!=0) {frequency[i]=1193180/frequency[i];}
ioctl(fd, KIOCSOUND, frequency[i]);
usleep(1000*duration[i]);
}
close(fd);
return 0;}
3. Программа 3musicbox.c
#include <stdio.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/kd.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char* argv[]){
int fd;
int i = 0;
int j = 0;
fd = open("/dev/tty0", O_WRONLY);
if(fd<0)
{perror("open(/dev/tty0)");return 1;}
if (argc != 2)
{printf("%s\n","Error. Rewrite parametrs!");
return 2; }
if(strcmp(argv[1],"1")==0)
{for (j=0;j<5;j++)
{int frequency = 0x0384;
int deltafreq = 0x000A;
for(i=0;i<200;i++)
{frequency=frequency+deltafreq;
ioctl(fd, KIOCSOUND, frequency);
usleep(10000);}
for(i=0;i<200;i++)
{
frequency=frequency-deltafreq;
ioctl(fd, KIOCSOUND, frequency);
usleep(10000);
}
}
}
if(strcmp(argv[1],"2")==0)
{
int frequency;
int duration[] = {300, 900, 300, 900, 100, 400, 100, 1000};
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
frequency = 0x0064;
if (j%2==0) {frequency=0;}
ioctl(fd, KIOCSOUND, frequency);
usleep(1000*duration[j]);
}
}
}
if(strcmp(argv[1],"3")==0)
{
int frequency[] = {247, 417, 417, 370, 417, 329, 247, 247, 417, 417, 370, 417, 497, 0, 497, 277, 277, 440, 440, 417, 370, 329, 247, 417, 417, 370, 417};
for(i=0;i<27;i++)
{
if(frequency[i]!=0) {frequency[i]=1193180/frequency[i];}
ioctl(fd, KIOCSOUND, frequency[i]);
usleep(500000);
}
}
ioctl(fd, KIOCSOUND, 0);
close(fd);return 0;}
1 Файловый дескриптор - это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор (Wikipedia.org).
---------------
------------------------------------------------------------
---------------
------------------------------------------------------------
Автор
sssfh131
Документ
Категория
Без категории
Просмотров
10
Размер файла
250 Кб
Теги
kursovaya
1/--страниц
Пожаловаться на содержимое документа