При запуске отлаженной программы abcd без параметров после ввода этой строки на экране должно быть:
this
is
a
test
the
abcd
program
При запуске отлаженной программы abcd с параметром -t после ввода этой строки на экране должно быть: this
test
the
Исходный текст программы abcd.c
для лаботаторной работы № 5
#include <stdio.h>
#include <ctype.h> /* */
#include <string.h>
/* Manifests for state machine to parse input line. */
#define WORD 0
#define IGNORE 1
/* Globals, used by both subroutines. */
char *Words[BUFSIZ/2]; /* Worst case, single letters. */
int WordCount;
/* Walk through the array of works, find those with the
* matching charakter, printing them on stdout. Note that
* the NULL charakter will match all words. */
void PrintWords(wc, match)
int wc; /* Number of words in Words[] */
char match; /* Attempt to match this charakter. */
{ register int ix; /* Index in Words[]. */
register char *cp; /* Pointer for searching. */
for (ix=0; ix < wc; ix++) {
cp = Words[ix];
/* Try to match the given character.
* Scan the word, attempting to match,
* or until the end of the word is found. */
while ((*cp) && (*cp++ != match));
if (*cp == match) /* Found a match? Write the word on stdout. */
(void) printf("%s0, Words[ix]); } return; }
/* Find words in the gives buffer. The Words[] array is set
* to point at words in the buffer, and the buffer modifeid
* with NULL characters to delimit the words. */
int GetWords (buf)
char buf[]; /* The input buffer. */
{ register char *cp; /* Pointer for scanning. */
int end = strlen(buf); /* length of the buffer. */
register int wc = 0; /* Number of words found. */
int state = IGNORE; /* Current state. */
/* For each character in the buffer. */
for (cp = &buf[0]; cp < &buf[end]; cp++) {
/* A simple state machine to process
* the current character in the buffer. */
switch(state) {
case IGNORE:
if (!isspace(*cp)) {
Words[wc++] = cp; /* Just started a word? Save it. */
state = WORD; /* Reset the state. */ } break;
case WORD:
if (isspace(*cp)) {
*cp = '\0'; /* Just completed aword? terminate it. */
state = IGNORE; /* Reset the state. */ } break; }}
return wc; /* Return the word count. */ }
int main(argc, argv) int argc; char *argv[]; { char buf[BUFSIZ], match;
/* Check command line arguments. */
if (argc < 2) match = ' ';
/* No command line argument, match all words. */
else match = *++argv[1]; /* match the char after the first - */
/* Until no more input on stdin. */
while(gets(buf) != (char *)NULL) {
WordCount = GetWords(buf); /* Paste the input buffer. */
PrintWords(WordCount, match); /* Print the matching words. */ }
return(0); /* Return success to the shell. *
ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ РАБОТЫ
1. Осуществите вход в систему.
2. Запустите mc – экранный интерфейс для OC Unix.
3. В домашнем каталоге создайте подкаталог examples.
4. Осуществите поиск на магнитном диске программы testcase.c (команда find).
5. Скопируйте файл testcase.c в ваш подкаталог examples под именем abcd.c.
6. Выполните компиляцию программы abcd.c
($ cc -o abcd abcd.c)
Исправьте синтаксические ошибки. Коррекция файла abcd.c должна быть выполнена с помощью редактора vi(vim).
7. После устранения всех синтаксических ошибок передайте файл abcd.c под управление CVS. Все последующие пункты лабораторной работы, связанные с коррекцией файла abcd.c, должны быть выполнены под контролем CVS.
8. Создайте в поддиректории examples make-файл (makefie), приведенный выше. Для создания этого файла используйте редактор vi. Далее различные варианты построения исполняемого модуля должны быть получены с помощью программы make.
9. Выполните отладку программы abcd.c. Для отладки используйте программу gdb. Каждое исправление в программе abcd.c должно сопровождаться комментарием инструментального средства CVS. Комментарий должен содержать текст на русском языке, поясняющий сущность исправлений (например, номер строки программы abcd.c и причина исправления).
10. После получения корректных результатов выполнения программы abcd с помощью редактора vi в начало отлаженной программы введите комментарий:
"Программа abcd отлажена с помощью отладчика gdb
дд.мм.гг. Бригадой группы ПМ-ХХ в составе:
ФИО1,
ФИО2..."
11. Выведите на терминал (и в файл) всю последовательность осуществленных модификаций содержимого файла abcd.c.
КОНТРОЛЬНЫЕ ВОПРОСЫ К РАБОТЕ
1. Как получить более полную информацию о программах: gcc, make, gdb и др.?
2. Назовите основные этапы разработки приложений в ОС Unix и дайте им краткую характеристику.
3. Что такое суффиксы и префиксы? Основное их назначение. Приведите примеры их использования.
4. Каковы основные задачи, решаемые инструментальным средством CVS?
5. Назовите основные этапы в схеме функционирования CVS и дайте им краткую характеристику.
6. Назовите основные команды инструментального средства CVS. Приведите примеры их использования.
7. Основное назначение компилятора с языка Си в ОС Unix.
8. Назначение программы make.
9. Приведите структуру make-файла. Дайте характеристику основным элементам этого файла.
10. Назовите основное свойство, присущее всем программам отладки. Что необходимо сделать, чтобы его можно было использовать?
11. Назовите основные команды отладчика gdb и дайте им характеристику.
12. Опишите по шагам схему отладки программы abcd.c, которую вы использовали при выполнении лабораторной работы.
13. Прокомментируйте реакцию компилятора на синтаксические ошибки в программе abcd.c при его первом запуске.
14. Дайте характеристику программе abcd.c и объясните сущность семантических ошибок, которые были выявлены вами при выполнении лабораторной работы.
Лабораторная работа № 6
СЕТЕВЫЕ СРЕДСТВА
POSIX-СОВМЕСТИМЫХ ОС.
ИСПОЛЬЗОВАНИЕ СЕТЕВЫХ КОМАНД
Цель работы. Ознакомиться с принципами построения, функционирования и использования компьютерных сетей, базирующихся на технологии TCP/IP. Приобрести практические навыки использования основных сетевых команд стека протоколов TCP/IP.
УКАЗАНИЯ К РАБОТЕ
POSIX-совместимая ОС (Linux, FreeBSD, SUN OS, …) обеспечи-вает быстрый доступ ко всем данным, приложениям и ресурсам в сети. Она использует, как правило, несколько коммуникационных стеков протоколов, таких как TCP/IP, IPX/SPX фирмы Novell и др. TCP/IP является нижним уровнем сетевого программного обеспечения и позволяет объединять компьютеры как в локальные, так и в глобальные сети. Оба этих протокола – Transmission Control Protocol (TCP) и Internet Protocol (IP) – являются промышленными и правительственными стандартами и лежат в основе многих сетевых программ. TCP/IP включает в себя утилиты (команды) rlogin, telnet, ftp и другие, которые служат для удаленной регистрации и переноса файлов в сети. При помощи TCP/IP можно построить как локальные сети, используя оптоволокно, коаксиал или витую пару, так и глобальные сети с помощью магистральных каналов и цифровых телефонных станций. Сеть TCP/IP позволяет клиентам сети разделять данные и ресурсы других систем. Даже в сети, состоящей из разнородных по архитектуре машин, пользователи могут быстро и легко регистрироваться на любой из них, получать доступ к периферийным устройствам и разделять данные.
Стек протоколов TCP/IP лежит в основе графических оконных продуктов, таких как X Windows (SCO), Open Windows (SUN), распределенных сетевых файловых систем, а также многих распределенных СУБД и других деловых и научных приложений.
Как и любая сложная система, сеть должна опираться на стандарты, без которых невозможно нормальное ее функционирование. В компьютерных сетях идеологической основой стандартизации является многоуровневый (иерархический) подход к разработке средств сетевого взаимодействия, и именно на основе этого подхода была разработана архитектура стека протоколов TCP/IP (4 уровня). На основе этого же подхода была разработана стандартная семиуровневая модель взаимодействия открытых систем (модель OSI), которая стала своего рода универсальным языком сетевых специалистов.
Формализованные правила, определяющие последовательность и формат сообщений, которыми обмениваются сетевые компоненты, лежащие на одном уровне, но в разных узлах (компьютерах), называются протоколом.
Иерархически организованный набор протоколов, достаточный для организации взаимодействия узлов (компьютеров) сети, называется стеком коммуникационных протоколов.
Большой вклад в развитие стека протоколов TCP/IP внес университет Беркли; он реализовал протоколы стека TCP/IP в своей версии ОС Unix. Широкое распространение ОС Unix привело к широкому распространению протоколов этого стека (в частности, протокола IP). На стеке протоколов TCP/IP работает всемирная информационная сеть INTERNET. Подразделение INTERNET (IETF – INTERNET Enginee-ring Task Force) вносит основной вклад в совершенствование стандартов стека, публикуемых в форме спецификаций RFC (обращение за разъяснениями).
На конец 2006 года документов RFC было более 4000. Документация о работах в INTERNET, предложения о новых или переработанных протоколах и стандартах протоколов TCP/IP, появляется в виде технических отчетов RFC. На 11 июня 2007 года их количество возросло до 4894. Содержательный смысл аббревиатуры RFC можно интерпретировать следующим образом:
· для разработчиков спецификаций (стандартов) расшифровывается как «запрос на комментарий»;
· для пользователей спецификаций (разработчиков сетевого ПО) расшифровывается как «обращение за разъяснениями».
Пример фрагмента таблицы, в которой содержится информация о RFC, приведен на рис. 6.1.
Обозначение | Название | Статус | Номер RFC |
…………….. | |||
IP | INTERNET protocol | обязательный | |
…………….. | |||
TCP | Transmission Control Protocol | обязательный | |
…………….. |
Рис. 6.1. Фрагмент таблицы RFC
На рис. 6.2 показана иерархическая четырехуровневая модель семейства протоколов TCP/IP.
Уровень приложений (процессов) | передача файлов (FTP) | электронная почта (SMTP) | эмуляция терминала (telnet) | безопасная оболочка (ssh) | управление сетью (SNMP) | |
RFC959 | RFC821 | RFC854 | RFC4251 | RFC1157 | ||
Транспортный уровень | TCP | UDP | ||||
RFC793 | RFC768 | |||||
Межсетевой уровень (сетевой) | ARP | IP | ICMP | |||
RFC86 | RFC791 | RFC792 …….. | ||||
RARP | ||||||
RFC903 | ||||||
Уровень сетевого интерфейса | Ethernet, FDDI, Token Ring,… | |||||
Витая пара, коаксиальный кабель, оптоволоконный кабель, радиорелейная линия, спутниковый канал,… | ||||||
Рис. 6.2. Архитектура TCP/IP
Архитектура семейства протоколов TCP/IP основана на представлении, что коммуникационная инфраструктура включает 3 объекта: процессы, хосты, сети.
Процессы являются основными коммуникационными объектами, так как между процессами в конечном итоге осуществляется передача информации. Выполнение процессов происходит на различных хостах. Передача информации между процессами происходит через сети, к которым подключены хосты.
Подобный взгляд позволяет сделать основной вывод: чтобы доставить данные процессу, их необходимо сначала передать нужному хосту, затем определенному процессу, который выполняется на этом хосте. Эти две фазы могут выполняться независимо. Основываясь на этом простом соображении, при разработке стека протоколов TCP/IP логично разделить обязанности по передаче информации между отдельными протоколами. Разработчиками протокола TCP/IP было выбрано 4 уровня:
· уровень сетевого интерфейса составляют протоколы, обеспечивающие физический доступ к сети. С помощью этих протоколов осуществляется передача данных между коммуникационными узлами, расположенными в одной сети. Протоколы уровня сетевого интерфейса формально не являются частью семейства протоколов TCP/IP. Однако стандарты INTERNET определяют, каким образом должна осуществляться передача данных TCP/IP с использованием протоколов Ethernet, Token Ring, FDDI и т.д. Моделью технологии Ethernet является общение джентльменов в темной комнате;
· межсетевой уровень составляют протоколы, обеспечивающие передачу данных между компьютерами, подключенными к различным сетям. Одной из задач, которая должна быть реализована протоколами этого уровня, является выбор маршрута следования данных.
Сетевые элементы, осуществляющие передачу данных из одной сети в другую, получили название (в контексте стека протоколов TCP/IP) шлюзов (современное название – маршрутизатор). Маршрутизатор имеет несколько сетевых интерфейсов, подключенных к различным физическим сетям, и его основной задачей является выбор маршрута передачи данных из одного сетевого интерфейса в другой. Основной представитель межсетевого уровня – протокол IP;
· транспортный уровень. Протоколы этого уровня обеспечивают передачу данных между процессами, выполняющимися на различных компьютерах. Кроме того, протоколы этого уровня могут реализовывать дополнительные функции: гарантированную доставку, создание виртуальных каналов, использование тайм-аутов и др. Основным протоколом является протокол TCP, обеспечивающий гарантированную передачу данных. одним из протоколов этого уровня является протокол UDP;
· уровень приложений (процессов). Протоколы этого уровня обеспечивают функционирование прикладных услуг, т. е. обеспечивают сервис компьютерных сетей. Прикладной уровень, в отличие от транспортного уровня, предусматривает сколь угодно протоколов передачи данных. Для того чтобы можно было определить, какой протокол прикладного уровня используется при передаче данных, а также для того, чтобы система могла передать эти данные соответствующей программе, было введено понятие порта. С точки зрения прикладного уровня, порт – это идентификатор сервиса, предоставляемого системой.
Отношения между программами, которые связываются по сети друг с другом, почти всегда асимметричны. Одной что-то надо (программа-клиент), у другой что-то есть (программа-сервер). Обратная ситуация, когда клиент хочет передать что-то серверу, сути дела не меняет: сервер предоставляет услугу клиенту, на этот раз – по приему данных. Клиент-серверная модель используется большинством сетевых команд.