Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Кафедра автоматики и электроники в машиностроении



 

 

 

 

Филоненко И.Н.

 

«Системное программирование»

 

Лабораторный практикум

 

 

 

Коломна

УДК 004.4 ББК 32.97 Ф-55  

Системное программирование: Лабораторный практикум для студентов очной и очно-заочной формы обучения для специальностей: 230105 – Программное обеспечение вычислительной техники и автоматизированных систем, 220201- «Управление и информатика в технических системах»: Сост. Филоненко И.Н. – Коломна: КИ (ф) МГОУ, 2010. – 53 с.

Лабораторный практикум составлен в соответствии с Государственными образовательными стандартами высшего профессионального образования по направлению подготовкидипломированного специалиста230105 – « Программное обеспечение вычислительной техники и автоматизированных систем », 220201- «Управление и информатика в технических системах».

 

Лабораторный практикум одобрен на заседании кафедры «Автоматика и электроника в машиностроении» Коломенского института (филиала) МГОУ (протокол № 6 от 15.03.10) и утвержден учебно-методическим советом.

 

УДК 004.4

ББК 32.97

© Филоненко И.Н.

© КИ (ф) МГОУ, 2010

Введение

 

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

Практическую реализацию заданий практикума предлагается разрабатывать на языке программирования С и отлаживать под управлением ОС UNIX или Linux. В процессе выполнения лабораторных работ студенты осваивают работу в ОСUNIX под управлением командного интерпретатора Bourne Shell, а также создание параллельных процессов в UNIX и алгоритмы их взаимодействия с использованием интерфейса системных вызовов, описанных в POSIX – стандарте.

Первая работа (4 часа) посвящена практическому освоению базовых принципов программирования на языке С в ОС UNIX.

Вторая работа (4 часа) направлена на освоение принципов работы под управлением командного интерпретатора Bourne Shell в ОС UNIX, изучение языка интерпретатора Bourne Shell и организацию сценариев, выполняемых этим интерпретатором.

Третья работа (8 часов) предназначена для освоения программного управления (на С ) свойствами процесса в ОС UNIX, а также программирование создания процесса в ОС UNIX средствами языка С. Во второй части работы(4 часа) студенты осваивают моделирование команд интерпретатора Bourne Shell в программах на языке С с низкоуровневым управлением вводом-выводом средствами С.

Четвертая работа (8 часов) посвящена практическому освоению организации взаимодействия процессов через pipe в программах на С в UNIX а так же реализации модели клиент-сервер с использованием FIFO.

 

 


Лабораторная работа № 1

Введение в язык С

 

 

Цель работы

Освоить на практике организацию программ на языке С, применение основных функций ввода/вывода, управляющих структур, структур данных типа массив, а так же отладку и выполнение программ в ОС UNIX (Free BSD).

 

 

Домашнее задание

1. Изучить структуру программ на С.

2. изучить синтаксис объявления величин в программе на С.

3. Освоить синтаксис и выполнение управляющих структур языка С: присвоение, разветвление, цикл.

4. изучить организацию ввода/вывода с помощью библиотечных функций С ( Scanf, printf, getchar, putchar ).

5. изучить команды компиляции программы на С в ОС UNIX ( gcc ) и запуск исполняемого файла ( a.out ).

 

 

Выполнение работы

1. Загрузить версию ОС UNIX – PC BSD 4.0.

2. Открыть терминальное окно для организации режима командной строки.

3. Организовать собственную папку в домашней директории /Home/Student.

4. Войти в редактор Kwrite и файл Noname сохранить в своей папке под собственным именем с расширением .

5. Набрать текст простой программы на С для вывода на экран сообщения:

«Hello, world»:

# include < stdio.h>

Main()

{

Printf(“Hello, world”);

}

и сохранить текст в файле с расширением .с.

6. Откомпилируйте программу с помощью команды:

> gcc firle1.c

Если компиляция прошла без ошибок, должен быть сформирован файл исполняемый a.out.

Примените ключ (-о) для получения откомпилированного файла с собственным именем file1.out.

Запустите file1.out на выполнение и проверьте полученный на экране вывод.

7. Измените программу так, чтобы каждое из слов фразы «Hello, world» выводилось с новой строки (ключ (\n)).

8. Наберите в файле file2.c программу для вывода таблицы температур по Фаренгейту и их соответствие по шкале Цельсия (формула 0С=(5/9)(0F-32) );

#include < stdio.h>

Main()

{

Int far, cels, lo, up, step;

lo=0;

up=300;

step=20;

far=lo;

while (far< =up){

cels=5*(far-32)/9;

printf(“%d\t %d\n”, far, cels);

far=far+step; }

}

Измените выражение для вычисления след.обр.: cels=5/9*(far-32);

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

9. Измените программу следующим образом:

а) чтобы вывод таблицы был прежним, но вместо оператора цикла while

используйте оператор:

for (< пар.ц.> =< нач. знач.>; < пар. ц.> < =< кон. знач.>;

< пар.ц.> = < пар.ц.> + < шаг> ) {операторы тела цикла};

убедитесь в идентичности выводимой таблицы прежнему варианту;

б) вместо задания значений параметрам с помощью присваиваний

используйте функцию scanf, которая считывает данные из потока ввода.

Например, для ввода даты:

Int day, year;

char month[20];

scanf(“%d %s %d”, & day, month, & year);

Внимание: аргументы функции scanf должны быть указателями.

10. Наберите в редакторе kwrite программу для подсчета символов во входном потоке, который заканчивается специальной константой EOF (это целое число):

#include < stdio.h>

Main()

{

Int nc;

Nc=0;

While (getchar()! = EOF)

++nc;

Printf(“%d\n”, nc);

}

11. Напишите и отладьте программу на С для подсчета числа строк во входном потоке (каждая строка заканчивается символом (\n)).

12. Составьте программу на языке С в соответствии с вариантом задания табл. 1, отладьте ее и включите в отчет по лаб. раб.

 

 

Таблица 1

№ вар. Текст задания
Написать программу для подсчета количества каждой из цифр (от 0 до 9) во входном потоке. Результаты сохранить в статическом массиве Ndigit[10] Замечание: значение символа – цифры равно значению ее кода минус код ноля
Ввести массив целых чисел из 10 элементов. Найти среднее арифметическое элементов массива и выяснить есть ли такое значение среди элементов массива
Дан массив N вещественных чисел. Найти max элемент и его номер.
Написать программу для подсчета количества чисел во входном потоке. Числа сохранить в массиве.
Дан массив N целых чисел. Отсортировать его в порядке возрастания методом «пузырька» (прямой обмен)
Дан массив N целых чисел, отсортированных в порядке возрастания. Методом бинарного поиска найти в массиве номер заданного целого х или вывести сообщение о его отсутствии.
Ввести массив N вещественных чисел. Определить сколько раз в массиве происходит смена знака.

 

 

Контрольные вопросы

 

 

1. Структура программы на языке С.

2. Назначение директивы include.

3. Функции для управления вводом / выводом на С.

4. Объясните назначение и использование системной константы EOF.

5. Организация статического и динамического массива в программе на С.

6. Организация строки в языке С.

 

 

Лабораторная работа № 2

Основы работы в OC UNIX. Работа с командным интерпретатором

Bourn Shell в интерактивном режиме.

Организация командных файлов

 

 

Цель работы

 

 

Изучить работу команд интерпретатора Bourne Shell в ОС UNIX; освоить синтаксис написания команд и организацию командного файла (скрипта) в ОС UNIX. Освоить работу в одном из текстовых редакторов UNIX (например, KWriter). С помощью языка Bourne Shell научиться составлять скрипты и работать с ними.

 

 

Содержание работы

 

 

1. Изучить программные средства языка интерпретатора Bourn Shell.

2.Ознакомиться с устройством файловой системы UNIX (упрощенное понятие). Изучить основные команды для работы с файлами, пользуясь методическими указаниями.

Выполнить в интерактивном режиме задания 1-6.

3. Освоить правила организации и запуска скрипта в OC UNIX.

Выполнить задание 7.

4. Освоить структуру программы на С, функции ввода/вывода.

Выполнить задание 8.

5. Составить отчет и защитить работу преподавателю, ответив на контрольные вопросы.

 


Методические указания к работе

Работа в современной версии ОС UNIX существенно отличается от работы с ОС UNIX пятнадцатилетней давности. Широкое распространение получил графический интерфейс, множество цветов, всевозможные графические утилиты настройки различных подсистем и т.д. Тем не менее, основой основ пользовательской среды и соответственно взаимодействия между пользователем и ОС является командная строка.

Основные назначения командного интерпретатора в ОС UNIX

1. При регистрации пользователя в системе первой запускаемой программой является командный интерпретатор. С него начинается " жизнь" всех остальных пользовательских процессов. Рассмотрим более подробно примерную схему работы пользователя в ОС UNIX.

После запуска ОС инициализирует процесс getty(1M) (сервер терминального доступа), запускающий программу login (1), запрашивающую у пользователя имя и пароль для входа в систему.

2. Если пользователь ввел корректные имя и пароль , login(1) запустит программу, путь к которой указан в последнем поле файла passwd, как правило, являющейся командным интерпретатором.

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

После завершения работы командного интерпретатора (например, командой exit ) пользователь завершает свою работу в системе.

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

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

Для командного интерпретатора Bourne Shell - инициализационный файл - profile.

 

 

Синтаксис языка Bourne Shell

Bourne Shell является достаточно развитым языком программирования даже для выполнения достаточно сложных заданий. Но, из-за особенностей работы скриптов shell (аналогично вводу с пользовательского терминала) не следует ждать высокой скорости обработки. Для этих задач существует, например, язык С.

 

 

Общий синтаксис скрипта

Синтаксис вызова команды из командного интерпретатора в самом общем случае обычно выглядит следующим образом:

 

< command> < flags> < arguments>

> ls -l /home/user1

Признаком флага является знак " -" перед флагом.

 

Командный интерпретатор позволяет группировать команды.

cmd1; cmd2 - последовательное выполнение команд.

cmd1 & - выполнение в фоновом режиме (демон).

cmd1 & & cmd2 - выполнение cmd2 в случае успешного завершения cmd1.

cmd1 || cmd2 - выполнение cmd2 в случае ненормального завершения cmd1.

Для группировки команд можно также использовать скобки " {}".

cmd1 & & cmd2; cmd3 - cmd2 будет выполнена только при условии успешного завершения cmd1, и не зависимо от этого будет далее выполнена cmd3.

cmd1 & & {cmd2; cmd3}

Обе команды cmd2 и cmd3 будут последовательно выполнены только в случае успешного завершения cmd1.

Скрипт представляет собой самый обычный текстовый файл. Командный интерпретатор последовательно считывает строки этого файла и последовательно их исполняет. Для того чтобы можно было запустить скрипт на исполнение необходимо иметь права на чтение (командный интерпретатор читает строки файла) и на исполнение (запуск команд и утилит) этого скрипта.

 

Комментарием в shell является строка, начинающаяся со знака " #".

 

# ЭТО КОММЕНТАРИЙ

 

Комментарий не обязательно должен занимать всю строку, например:

cat /var/run/inetd.pid # вывести на консоль PID интернет-супердемона

 

Поскольку в системе может находится не один командный интерпретатор, то путь к интерпретатору указывается в первой строке скрипта следующим образом:

 

#! /bin/sh

 

Переменные

 


Все переменные в Shell текстовые. Т.е. представляют собой в общем случае строку символов определенной длины. Вобщем то сам по себе Shell может работать только с двумя типами данных, это строка и файл. Тем не менее это не умаляет роль командного интерпретатора в системе. Имя переменной аналогично представлению идентификатора, т.е. может состоять из букв, цифр и знаков подчеркивания, причем начинаться имя переменной может либо со знака подчеркивания либо с буквы, но никак не с цифры. Для присваивания значения переменной используется знак присвоения " =". Для того, чтобы воспользоваться переменной следует перед ее именем поставить знак " $". Использование переменных в Shell называется подстановкой.

 

variab1=25 # Не число 25, а строка " 25"


variab2=" SYS ADMIN" # Кавычки, потому что пробел


Имя переменной и ее значение относительно знака присваивания " =" должно быть записано без пробелов.


$ echo $variab2

SYS ADMIN

Используя утилиту echo(1) выполняем вывод на консоль переменной. Конечно, значение одной переменной можно присвоить другой переменной.


variab1=$variab2


Здесь переменной variab1 было присвоено значение переменной variab2. Существуют и иные способы присвоения значений переменным. Одно неизменно: значение переменной это - строка. Например, значение переменной можно присвоить, используя строку вывода некоторой команды.


variab3=`cat /var/run/inetd.pid`


Здесь переменной variab3 присваивается значение вывода, полученной от команды, заключенной в одинарные кавычки. В данном случае значение переменной variab3 будет PID демона inetd. Значение переменной можно получить и интерактивно, т.е. с клавиатуры.


echo -n " Введите свое имя"

Read username

 

При запуске командный интерпретатор выведет строку " Введите свое имя" и будет ждать ввода с клавиатуры. Строка, введенная пользователем, и будет значением переменной username. При использовании любой переменной Shell подставляет ее значение.

 

 

Встроенные переменные

 

 

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


Встроенные переменные:


$1, $2, $3. .. Позиционные параметры скрипта.


$# Число позиционных параметров (десятичное).


$? Код возврата предыдущего процесса.


$$PID текущего Shell.


$! PID последнего процесса, запущенного в фоновом режиме.


$* Все позиционные параметры скрипта, передаваемые заключенными в кавычки:

" $*" - " $1 $2 $3..."


$@ Все позиционные параметры скрипта, передаваемые как отдельные строки, заключенные в кавычки.

$@ - " $1" " $2" " $3" ....


Поясним встроенные переменные Shell на примере.


Текст скрипта Запуск скрипта

#! /bin/sh $./script1.sh par1 par2 par3

echo script $0 script./script1.sh

echo $1 $2 $3 par1 par2 par3

 

Здесь наблюдается полная аналогия с argv при вызове функции main() в языке С. Встроенную переменную $# используют в том случае, когда необходимо убедится в том, что скрипту было передано нужное количество параметров.

Текст скрипта:


#! /bin/sh

if [ $# -lt 3 ]; then

echo missing parameters! usage: $0 par1 par2 par3

Exit 1

fi

В данном скрипте используется условный параметр if и команда test. Интуитивно понятно, что происходит сравнение количества переданных параметров (переменная $#) и если это значение меньше 3, тогда на консоль выводится сообщение. Строка " exit 1" формирует код возврата скрипта равный единице. В OC UNIX за успешное завершение принят код возврата " 0". Если код возврата не равен нулю, это означает ошибку.

 

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 437; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.074 с.)
Главная | Случайная страница | Обратная связь