План нмв 2004 р. Укладачі

Вид материалаДокументы

Содержание


ОДЕСЬКА НАЦІОНАЛЬНА АКАДЕМІЯ ЗВ’ЯЗКУ ім. О. С. Попова
Взаємодія процесів в ос unix
2 Основні положення
Повідомлення та їхні черги
Розподілювану пам’ять
2.2 Взаємодія поміж процесами за допомогою іменованих каналів
2.3 Функції та системні виклики ОС UNIX
3 Контрольні запитання
4 Домашнє завдання
5 Лабораторне завдання
6 Зміст протоколу
Взаємодія процесів в ос unix
2 Основні положення
2.2 Програмний інтерфейс сокетів
Sock_stream ipproto_tcp (tcp)
2.3 Приклад використання сокета
3 Контрольні запитання
4 Домашнє завдання
5 Лабораторне завдання
6 Зміст протоколу
...
Полное содержание
Подобный материал:
  1   2   3   4   5


Державний комітет зв’язку та інформатизації України

—————————————————

ОДЕСЬКА НАЦІОНАЛЬНА АКАДЕМІЯ ЗВ’ЯЗКУ ім. О. С. Попова


Кафедра обчислювальної техніки та мікропроцесорів


Створення програмного забезпечення телекомунікацій

для роботи в ОС UNIX


Методичний посібник

до лабораторних робіт № 15 — 19

з дисципліни

Системне та прикладне програмне забезпечення в телекомунікаціях”

для спеціальності 7.092402


Одеса 2004


Державний комітет зв’язку та інформатизації України

—————————————————

ОДЕСЬКА НАЦІОНАЛЬНА АКАДЕМІЯ ЗВ’ЯЗКУ ім. О. С. Попова


Кафедра обчислювальної техніки та мікропроцесорів


Створення програмного забезпечення телекомунікацій

для роботи в ОС UNIX


Методичний посібник

до лабораторних робіт № 15 — 19

з дисципліни

Системне та прикладне програмне забезпечення в телекомунікаціях”

для спеціальності 7.092402


ЗАТВЕРДЖЕНО

методичною радою академії

Протокол № 8

від 9.03.2004 р.


Одеса 2004


УДК 681.3.06

План НМВ 2004 р.


Укладачі — С. П. Главацький

І. В. Хіхловська


Рецензент — О. В. Онацький


Методичний посібник “Створення програмного забезпечення телекомунікацій для роботи в ОС UNIX” до лабораторних робіт № 15 — 19 спрямований на ознайомлення студентів з основними способами взаємодії процесів в мережі в середовищі ОС UNIX; містить основні положення щодо створення, налагодження та ведення програмного забезпечення мережних додатків, а також опис інструментів та ресурсів налаштування мереж, мережних додатків та обліку трафіка. Наведені домашні завдання та форма звітності до кожної з лабораторних робіт.


СХВАЛЕНО

на засіданні кафедри

обчислювальної техніки

та мікропроцесорів

і рекомендовано до друку

Протокол № 4

від 18.12.2003 р.


ЗМІСТ


1 Лабораторна робота № 15 Взаємодія процесів в ОС UNIX за допомогою

іменованих каналів 4

2 Лабораторна робота № 16 Взаємодія процесів в ОС UNIX за допомогою

інтерфейсу сокетів 12

3 Лабораторна робота № 17 Програмна реалізація протоколів ТСР/ІР 24

4 Лабораторна робота № 18 Інструменти та ресурси налагодження мереж та

мережних додатків 30

5 Лабораторна робота № 19 Створення системи обліку трафіка 46

Додаток А Тексти програм serverfifo та clientfifo 56

Додаток Б Тексти програм socketserver та socketclient 58

Додаток В Тексти програм servertcp та clienttcp 60

Додаток Г Тексти програм simpletcpserv та simpletcpclient 63

Додаток Д Лістинг програми обліку трафіка 65


Лабораторна робота № 15



ВЗАЄМОДІЯ ПРОЦЕСІВ В ОС UNIX
ЗА ДОПОМОГОЮ ІМЕНОВАНИХ КАНАЛІВ


1 Мета роботи


Метою роботи є вивчення взаємодії процесів у ОС UNIX за допомогою різних засобів, набуття навичок написання, налагоджування та ведення програм взаємодії процесів за допомогою іменованих каналів у ОС UNIX.


2 Основні положення


2.1 Способи забезпечення взаємодії процесів в ОС UNIX


В ОС UNIX процеси виконуються у власних адресних просторах і є ізольовані один від одного; тим самим зведено до мінімуму можливості впливу процесів один на одного, що є надто важливим у багатозадачних ОС, однак власне концепція UNIX ґрунтується на модульному принципі й передбачає взаємодію поміж процесами.

Взаємодія поміж процесами необхідна для розв’язування таких завдань:

1 Передавання даних; їхній обсяг може коливатись від десятків байтів до кількох мегабайтів.

2 Спільне використання даних; процеси можуть використовувати спільно одну копію даних, причому зміни, внесені одним процесом, відразу будуть помітні для іншого. Кількість взаємодіючих процесів може бути більшою за два. З метою збереження цілісності ресурсів процесам може потребуватись протокол взаємодії для збереження цілісності даних та виключення конфліктів при доступі до них.

3 Повідомлення використовуються, коли один процес має сповістити інший про певну подію, наприклад для синхронізування кількох процесів. Розв’язується ця задача засобами ОС, тому що власне самі процеси у рамцях багатозадачної ОС діяли б неефективно і навіть небезпечно.

До засобів міжпроцесної взаємодії, притаманних усім версіям UNIX, належать:
  • сигнали;
  • канали;
  • іменовані канали FIFO;
  • повідомлення та їх черги;
  • семафори;
  • розподілювана пам’ять;
  • сокети.

Використання сигналів обмежується сферою повідомлень про помилки, але вони можуть використовуватись і для синхронізування процесів, передавання простіших команд від одного процесу до іншого. Сигнали є надто ресурсоємні, малоінформативні й їхню кількість обмежено.

Канали може бути зорганізовано при роботі у командному рядку shell:

cat myfile |wc.

Стандартне виведення програми cat(1), яка виводить вміст файла myfile, передається на стандартний ввід програми wc(1), яка, у свою чергу, підраховує кількість рядків, слів та символів. Як наслідок на екран монітора буде виведено дані:

12 45 260,

що означає кількість рядків, слів та символів у файлі myfile. Отже, два процеси обмінялися даними. Програмний канал забезпечує односпрямоване передавання даних поміж двома процесами.

Для створення каналу використовується системний виклик pipe(2)

int pipe(int *filedes),

який повертає два файлових дескриптори: filedes[0] — для запису до каналу та filedes[1] — для читання з каналу. Якщо один процес записує дані до filedes[0], інший може отримати ці дані з filedes[1]. При створюванні процесу атрибути батьківського процесу наслідуються дочірнім процесом, у тому числі файлові дескриптори. Доступ до дескрипторів filedes каналу може отримати сам процес, що він викликав pipe(2), та його дочірні процеси. Отже, канали може бути використано для передавання даних лише поміж родинними процесами, а для міжпроцесної взаємодії поміж незалежними процесами не використовуються.

У наведеному прикладі обидва процеси, cat(1) та wc(1), створюються процесом shell і тому є родинними, хоча на перший погляд здаються незалежними.

Повідомлення та їхні черги є складовою частиною UNIX System V, вони обслуговуються ОС, розміщуються в адресному просторі ядра і є розподілюваним системним ресурсом. Кожна черга має свій унікальний ідентифікатор, а процеси можуть записувати та зчитувати повідомлення з різних черг. Процес, що він надсилає повідомлення до черги, може не очікувати на читання цього повідомлення певним іншим процесом. Він може завершити своє виконання, залишивши у черзі повідомлення, яке буде прочитане іншим процесом пізніше. Це надає можливість процесам обмінюватись структурованими даними, які мають атрибути:
  • тип повідомлення; повідомлення в одній черзі можуть бути мультиплексовані;
  • довжина даних повідомлення у байтах (може бути нульовою);
  • власне дані; за ненульової довжини вони можуть бути структурованими.

Процес може розміщувати у черзі повідомлення за допомогою функції msgsnd(2), отримувати повідомлення певного типу з черги за допомогою msgrcv(2), керувати повідомленнями за допомогою функції msgctl(2).

Типова є ситуація взаємодії процесів, коли серверний процес обмінюється даними з кількома клієнтами, виглядає таким чином: в одній черзі можна мультиплексувати повідомлення від різних процесів, що дозволяє виконувати для обміну одну чергу, але кожному з повідомлень, спрямованих від будь-якого клієнта серверові, треба надавати значення типу, наприклад, 1; якщо в тілі повідомлення клієнт певним чином ідентифікує себе, наприклад передає свій PID, то сервер може переспрямовувати повідомлення конкретному клієнтові, привласнюючи тип повідомлення дорівнюваним цьому ідентифікаторові, функція msgrcv(2) дозволяє приймати повідомлення певного типу, тому сервер прийматиме повідомлення з типом 1, а клієнти — повідомлення з типами, що вони дорівнюють ідентифікаторам їхніх клієнтів.

Семафори використовуються для синхронізування доступу кількох процесів до розподілюваних ресурсів. Вони виконують функцію дозволу або заборони процесу використання того чи того розподілюваного ресурсу. Семафори є системним ресурсом, дії над яким зреалізовуються через інтерфейс системних функцій і не призначені для обміну потужними обсягами даних. UNIX припускає три можливі операції над семафором, що вони визначаються системним викликом semop(2), а саме його полем semop

int semop(int semid, struct sembuf *semop, size_t nops):

1 якщо величина semop додатна, поточне значення семафора збільшується на цю величину;

2 якщо значення semop дорівнює нулю, процес очікує, допоки семафор не обнулиться;

3 якщо значення semop є від’ємне, процес очікує, допоки значення семафора не збільшиться або не дорівнюватиме абсолютному значенню semop, після чого це значення віднімається від значення семафора.

Перша операція змінює значення семафора безумовно, друга — лише перевіряє його значення, тобто зреалізовується умовне виконання, третя — перевіряє й змінює значення семафора — умовне виконання операції. Наведений приклад є прикладом кооперативно виконуваних семафорів як функцій ОС: взаємодіючі процеси мають домовлятися щодо їхнього використання. ОС не накладає жодних обмежень на використання семафорів, зокрема процеси самі вирішують, яке значення семафора є таким, що дозволяє, на яку величину зміниться значення семафора тощо. Інтенсивний обмін даними поміж процесами за допомогою каналів та черг повідомлень може зменшити продуктивність системи. Це пов’язано з тим, що дані, передавані за допомогою цих об’єктів, копіюються з буфера передавального процесу у буфер ядра, а потім — у буфер приймального процесу.

Розподілювану пам’ять зорганізовано у такий спосіб, який надає двом чи більшій кількості процесів можливість безпосереднього доступу до однієї області пам’яті для обміну даними. Безумовно, процеси мають попередньо “домовитись” щодо правил використання розподілюваної пам’яті. Наприклад, допоки один з процесів записує дані до розподілюваної пам’яті, решта процесів мають утримуватись від роботи з нею. Завдання кооперативного використовування розподілюваної пам’яті розв’язується за допомогою синхронізування виконання процесів засобами семафорів. Сценарій роботи з розподілюваною пам’яттю має вигляд:

1 Сервер отримує доступ до розподілюваної пам’яті, використовуючи семафор.

2 Сервер записує дані у розподілювану пам’ять.

3 Після завершення запису сервер звільнює розподілювану пам’ять за допомогою семафора.

4 Клієнт отримує доступ до розподілюваної пам’яті й закриває доступ до ресурсу за допомогою семафора.

5 Клієнт читає дані з розподілюваної пам’яті, відкриваючи доступ до ресурсу, використовуючи семафор.

Кілька процесів можуть відбивати області розподілюваної пам’яті на різні ділянки власного віртуального адресного простору. Розподілювана пам’ять є найбільш швидкий та найменш ресурсоємний спосіб взаємодії процесів.

Сокети — це спеціальні об’єкти, які позначають комунікаційний вузол, котрий забезпечує приймання та передавання даних для процесу.


2.2 Взаємодія поміж процесами за допомогою іменованих каналів


Назва каналів FIFO походить від абревіатури висловлювання FIRST IN FIRST OUT (перший увійшов, перший вийшов). FIFO є надто схожі на канали, вони є односпрямованим засобом передавання даних, причому читання даних відбувається у тому ж самому порядку, що й записування. На відміну від програмних каналів, вони мають імена, які дозволяють незалежним програмам отримати доступ до цих об’єктів. FIFO є засобом версії UNIX System V і для використання в інших версіях потребують встановлення додаткових бібліотек системних викликів.

FIFO є окремим типом файла у файловій системі UNIX (результат виконання команди ls –l покаже символ р у першій позиції). Для створення FIFO використовується системний виклик mkfifo(2):

int mkfifo(char *pathname, int mode),

де: pathname — ім’я файла у файловій системі (ім’я FIFO),

mode — прапорці володіння, прав доступу тощо.

FIFO може бути створено і з командою рядка shell:

$ mkfifo name p

Після створення FIFO може бути відкрито на записування та читання, причому записування та читання можуть відбуватися в різних незалежних процесах. Канали FIFO та звичайні канали працюють за такими правилами:

1 При читанні меншої кількості байтів, аніж перебуває в каналі або FIFO, повертається потрібна кількість байтів, а решта зберігається для подальших читань.

2 При читанні більшої кількості байтів, аніж перебуває в каналі чи FIFO, повертається доступна кількість байтів. Процес, що він читає з каналу, має опрацьовувати ситуацію, коли прочитано менше, аніж замовлено.

3 Якщо канал є порожній і жоден процес не відкрив його на записування, системний виклик read(2) буде заблоковано до з’явлення даних (якщо лише для каналу або FIFO не встановлено прапорець відсутності блокування O_NDELAY).

4 Запис кількості байтів меншої ємності каналу або FIFO гарантовано атомарно. Це означає, що в разі, коли кілька процесів водночас записують дані до каналу, порції даних від цих процесів не перемішуються.

5 У перебігу запису більшої кількості байтів, аніж це дозволяє канал або FIFO, виклик write(2) блокується до звільнення потрібного місця, але атомарність цієї операції не гарантується. Якщо процес намагається записати дані до каналу, не відкриваного жодним процесом, процесові генерується сигнал SIGPIPE, а виклик write(2) повертає 0 із встановленням помилки (errno = EPIPE). Якщо процес не встановив опрацьовування сигналу SIGPIPE, опрацьовування відбувається за умовчанням — процес завершується.

У каналі може перебувати лише певна кількість байтів, перш ніж наступний виклик write(2) буде заблоковано. Мінімальний розмір каналу, визначений POSIX, дорівнює 512 байтів. Виклик write(2) виконується неподільними порціями, і запис виконується ядром за одну неперервну операцію. Батьківський процес виконується у нескінченному циклі, а дочірній надсилає повідомлення батьківському, опитуючи канал і перевіряючи, чи надійшли дані.

Буферізація даних у каналі стандартно зреалізовується шляхом відокремлювання дискового простору у структурі файлової системи. Отже, запис та читання пов’язані з дисковим введенням/виведенням, що зменшує його продуктивність. Сучасні серверні ОС забезпечують роботу каналів через спеціальну файлову систему HPPS (High Performance Pipe System). З її допомогою дані буферизуються в оперативній пам’яті, що прискорює запис/читання.


2.3 Функції та системні виклики ОС UNIX,

потрібні для створювання іменованих каналів


1 Функція pipe(2) створює односпрямований канал (симплексний) для анонімного обміну даними поміж двома спорідненими процесами, позаяк лише вони можуть отримати доступ до одного й того самого каналу. Після завершення роботи канал знищується. Функція має вигляд

#include

int pipe(int filedes[2])

Функція повертає два файлових дескриптори fd у масиві fd[0] та fd[1]; filedes[0] дозволяє читання даних з каналу, а filedes[1] використовується для записування даних у канал.

2 Функція fcntl(2) забезпечує керування файловими операціями у вже відкритих файлах, заданих дескрипторами файла — filedes.

#include < fcntl.h> — заголовний файл, у якому визначено цілі константи: O_RDONLY (для решти лише читати), O_WRONLY (для решти лише писати), O_RDWR (для решти читати та писати), які встановлюють або знімають блокування на файли чи їхні частки.

int fcntl (int filedes, int cmd, …) — функція fcntl(2) виконує дію, зазначену в cmd, з файлом, а третій аргумент залежить від конкретної дії:

а) F_SETLK — встановити блокування запису файла; структура flock описує блокування, а покажчик на неї передається у третьому аргументі; за неможливості блокування fcntl(2) повертається з помилкою EACCESS або EAGAIN.

б) F_SETLKW — аналогічний до попереднього, але аргумент використовується за неможливості блокування, якщо запис вже заблоковано; процес переходить до стану сну, очікуючи на зняття блокування (W_WAIT, очікувати).

в) F_SETFL — визначає режим запису даних наприкінці файла.

3 Функція printf(2) — запис до форматизованого стандартного виводу.

4 Системний виклик unlink(2) вилучає файл, наприклад unlink(“/tmp/usedfile”); виклик повертає 0 у разі успішного завершення та -1 — у разі помилки.

5 Системний виклик read(2) копіює довільну кількість символів чи байтів з файла до буфера (в ASCII кодах).

6 Системний виклик open(2) відкриває файл для читання, запису або створює порожній файл.

7 Системний виклик close(2) закриває файл, повертає його в разі успішного завершення та -1 — у разі помилки:

#include

int close (int filedes)

filedes = open(“file”, O_RDONLY);







close (filedes);

8 Системний виклик write(2) — копіює дані з буфера програми, що трактується як масив, до зовнішнього файла. Він, як і read(2), має три аргументи: дескриптор файла filedes, покажчик на записувані дані buffer та n — додатне число, котре визначає кількість записуваних байтів.

#include

ssize_t write(int filedes, const void *buffer, size_t n).

У додатку А наведено тексти програм “Сервера” та “Клієнта”, які зреалізовують взаємодію процесів за допомогою іменованих каналів FIFO. Клієнт за традицією надсилає серверові повідомлення “Dobryj denj, Svite!”, а сервер виводить це повідомлення на термінал. Програми написано мовою С.


3 Контрольні запитання


1 З якою метою взаємодіють поміж собою процеси?

2 За допомогою яких засобів взаємодіють поміж собою процеси у всіх версіях UNIX?

3 Взаємодію поміж якими процесами можуть забезпечити канали?

4 Які атрибути має системний виклик mkfifo(2)?

5 За якими правилами працюють канали та іменовані канали?

6 Чим відрізняється FIFO від звичайного каналу?

7 Яку функцію виконує системний виклик unlink(2)?

8 Що зреалізовує функція fcntl(2)?


4 Домашнє завдання


1 Відповісти на контрольні запитання у письмовій формі.

2 Переписати до протоколу тексти обох програм та зробити до них коментарі.

3 Змінити в програмі клієнта текст передаваного повідомлення на власне прізвище, ім’я та по-батькові, змінивши водночас необхідні параметри; пояснити ці зміни.


5 Лабораторне завдання


1 Підімкніться до комп’ютера під керуванням ОС UNIX за допомогою telnet (“Пуск\Виконати\telnet ip”, де ip — адреса машини під керуванням UNIX).

2 Після підімкнення введіть ім’я (login) та пароль (password) згідно з таблицею 5.1.


Таблиця 5.1 — Імена та паролі

login

st1

st2

st3

st4

st5

st6

st7

st8

st9

password

st1

st2

st3

st4

st5

st6

st7

st8

st9

login

st11

st12

st13

st14

st15

st16

st17

st18

st19

password

st11

st12

st13

st14

st15

st16

st17

st18

st19


3 Створіть текстові файли serverfifo.c та clientfifo.c у редакторі ее, вихідні тексти цих файлів розміщено у додатку А (Лістинг 1 та Лістинг 2).

Для цього треба набрати:

ee serverfifo.c на першому терміналі

ee clientfifo.c на другому терміналі

Для збереження треба натиснути Esc + Enter.

4 Відкомпілюйте програми:

cc -o serverfifo serverfifo.c

cc -o clientfifo clientfifo.c

5 У разі успішної компілювання на першому терміналі командою ls -1 можна спостерігати з’явлення виконуваного файла ./serverfifo, а на другому — ./clientfifo.

6 Перевірте результати роботи програм; у разі з’явлення повідомлень про помилки, поясніть їх та усуньте, після чого знову запустіть програми та отримайте позитивний результат — з’явлення на терміналі сервера Ваших прізвища, ім’я та по-батькові.

7 Змоделюйте ситуації, коли неможливо створити, відкрити та вилучити FIFO, а також коли виникає помилка виведення та записування, потім знову налаштуйте програми та виконайте їх.


6 Зміст протоколу


Протокол лабораторної роботи “Взаємодія процесів в ОС UNIX за допомогою іменованих каналів” оформлюється в робочому зошиті в послідовності, котра визначається стандартом підприємства з основ лабораторного практикуму. Протокол має містити назву лабораторної роботи та її мету, результати виконання домашнього завдання згідно з вимогами розділу 4; тексти програм serverfifo та clientfifo з коментарями; результати виконання пунктів 1...7 лабораторного завдання з коментарями.


7 Список рекомендованої літератури


1 Робачевский А. М. Операционная система UNIX. — СПб.: БХВ-Петербург, 2002.

2 Ивановский С. Операционная система UNIX. — М.: Познавательная книга плюс, 2000.

3 Дегтярев Е. К. Введение в UNIX. — М.: МП "Память", 1991.

4 sd.org.ru