
- •Національний авіаційний університет
- •Лабораторний практикум з дисципліни «Мультиплатформені операційні середовища»
- •Визначення, позначення і скорочення
- •2.2. Використання клавіатури пк в ос qnx
- •2.3. Основні команди в ос qnx
- •2.4. Робота в файловій системі ос qnx
- •2.5. Ініціювання і завершення роботи в графічній оболонці Photon
- •3. Зміст звіту про лабораторну роботу
- •4. Питання для самоконтролю
- •5. Завдання на лабораторну роботу
- •Лабораторна робота № 2. Компіляція програм Короткі теоретичні відомості
- •Мікроядро
- •Системні і користувацькі процеси
- •Драйвери пристроїв
- •Зв'язок між процесами (ipc)
- •Qnx як мережа
- •Текст програми
- •Лабораторна робота №4. Повідомлення Короткі теоретичні відомості Архітектура і структура обміну повідомленнями
- •Текст програми
- •Послідовність дій
- •Результати
- •Лабораторна робота № 5. Тайм-аути Короткі теоретичні відомості Тайм-аути ядра
- •Текст програми
- •Текст програми
- •Послідовність дій
- •Результати
- •Послідовність дій
- •Результати
- •Лабораторна робота № 8. Створення найпростішого сервера в ос qnx
- •Короткі теоретичні відомості Функція Socket
- •Функція Bind
- •Функції listen і accept
- •Читання з сокета
- •Запис в сокет
- •Закриття сокета
Послідовність дій
Цей приклад в значній мірі схожий на програму з застосуванням очікування блокування, з невеликими відмінностями Перша відмінність, яка впадає в очі, - тут використаний новий тип даних, pthread_cond__t. Це просто декларація для умовної змінної; ми назвали нашу умовну змінну condvar.
Наступне, що видно з прикладу, - це те, що структура «споживача» ідентична такій в попередньому прикладі очікуванням блокуванням.
Основна відмінність тут полягає в тому, що бібліотека очікувань блокувань має прихований внутрішній мутекс, а при використанні умовних змінних мутекс передається явно. Останній спосіб дає нам більше гнучкості.
І, нарешті, зверніть увагу на те, що ми використовували функцію pthread_cond_signal() (знову ж, з явною передачею мутекс).
Результати
# root/a.out
Start
Eto potrebitel
W1
W2
Eto ptoizvoditel
ptoizvoditel polychil dannie ot h/w = 0
Wp1
Wp3
W3
dannie ot proizv = 1
W1
W2
ptoizvoditel polychil dannie ot h/w = 1
Wp1
Wp3
W3
dannie ot proizv = 2
W1
W2
ptoizvoditel polychil dannie ot h/w = 2
Wp1
Wp3
W3
dannie ot proizv = 3
W1
W2
ptoizvoditel polychil dannie ot h/w = 3
Wp1
Wp3
W3
dannie ot proizv = 4
W1
W2
Лабораторна робота № 8. Створення найпростішого сервера в ос qnx
Мета роботи: Написати програму, що створює найпростіший Web-сервер.
Короткі теоретичні відомості Функція Socket
Для створення сокета використовується системний виклик socket.
s = socket (domain, type, protocol);
Цей виклик грунтується на інформації про комунікаційний домен і тип сокета. Для використання особливостей Internet, значення параметрів повинні бути наступними:
communication domain - AF_INET (Internet протоколи).
type of the socket - SOCK_STREAM (цей тип забезпечує послідовний, надійний, орієнтований на встановлення двостороннього зв'язку потік байтів).
Функція socket створює кінцеву точку для комунікацій і повертає файловий дескриптор, який посилається на сокет, або -1 у випадку помилки. Даний дескриптор використовується надалі для встановлення зв'язку. Для створення сокета типу stream з протоколом TCP, що забезпечує комунікаційну підтримку, виклик функції socket повинен бути наступним:
s = socket (AF_INET, SOCK_STREAM, 0);
Функція Bind
Сокет створюється без імені. Поки з сокетом не буде пов'язане ім'я, віддалені процеси не мають можливості посилатися на нього і, отже, на даному сокеті не може бути отримано жодних повідомлень. Комунікаційні процеси використовують для даних цілей асоціації. В Internet домені асоціація складається з локальної і віддаленої адреси і з локального і віддаленого порту. У більшості доменів асоціація повинна бути унікальною. В Internet домені зв'язування сокета і імені може бути вельми складним, але, на щастя, зазвичай немає необхідності спеціально прив'язувати адресу і номер порту до сокета, так як функції connect і send автоматично зв'яжуть даний сокет з відповідною адресою, якщо це не було зроблено до їх виклику. Для зв'язування сокета з адресою і номером порту використовують системний виклик bind:
bind (s, name, namelen);
Прив'язка імені (name) - це рядок байт змінної довжини, що інтерпретується підтримуваним протоколом.