Лабораторна робота №10 Використання повідомлень



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

 

Завдання для самостійної підготовки:

Вивчити:

− поняття черги повідомлень ОС UNIX;

− організацію взаємодії процесів з використанням черги повідомлень;

− системні виклики керування чергою повідомлень;

 

Методичні вказівки

Загальні відомості

Суть обміну даними між процесами з використанням повідомлень полягає в наступному. У системі є так звана черга повідомлень, у якій кожне повідомлення представляє із себе структуру даних, з якої асоційований буфер, що містить тіло повідомлення й ознака, що називається типом повідомлення. Черга повідомлень може бути розглянута подвійно:

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

−   крім того, тому що кожне повідомлення має тип (на схемі - буква поруч із номером повідомлення), те цю чергу можна розглядати, як суперпозицію черг, пов'язану з повідомленнями одного типу.

 

 

Рисунок 5 - Черга повідомлень

 

Система IPC дозволяє створювати поділюваний ресурс, називаний “черга повідомлень” - таких черг може бути довільна кількість. Можна створити черга, підключитися до неї, послати повідомлення, прийняти повідомлення, знищити черга й т.д.

 

Використання повідомлень

Для ідентифікації повідомлень можна використовувати ключі, які генеруються в системі при виклику функції

key_t ftok(char *filename, char proj);

 

Як ім'я файлу можна задавати ім'я будь-якого існуючого файлу, зокрема, для визначеності можна використовувати ім'я самої програми.

Для обміну використовуються черги повідомлень. Черга створюється функцією

 

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgget(key_t key, int msgflg);

 

Якщо процесу необхідно створити нову чергу повідомлень, то прапор повинен містити макрос IPC_CREAT, а також права на читання й запис повідомлень у чергу (0644). При нормальному завершенні функція повертає ідентифікатор черги, у випадку помилки вертається значення -1.

Посилка й прийом повідомлень організуються при виклику функцій

int msgsnd(int msgid, struct msgbuf *msgp, int msgsz, int msgflg);

и

int msgrcv(int msgid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);

 

Перший параметр задає ідентифікатор черги. Другий параметр є покажчиком на повідомлення. Повідомлення являє собою структуру

struct msgbuf {

long mtype; /* тип повідомлення */

char mtext[]; /* покажчик на буфер повідомлення */ };

 

Параметр msgsz визначає довжину повідомлення. При значенні параметра msgflg=0 процес може блокуватися доти, поки функція не буде виконана. Параметр msgtyp задає правила вибору повідомлення із черги. При нульовому значенні параметра із черги витягає саме старе повідомлення будь-якого типу. Позитивне значення визначає прийом самого старого повідомлення зазначеного типу.

Видалення черги із системи виробляється при виклику функції

int msgctl(int msgid, int cmd, struct msgbuf *msgp);

при значенні параметра cmd рівному  IPC_RMID , третій параметр при цьому встановлюється в значення NULL.

 

Розглянемо дві програми. Перша буде виконувати роль сервера. Вона створює чергу повідомлень і посилає другій програмі - клієнтові рядок уведеного із клавіатури тексту. Для попереднього формування повідомлення створюється структура buf по шаблоні mybuf. По запиті із клавіатури водиться рядок тексту (рядок text).

Далі формується ключ. Вихідним рядком для формування ключа служить ім'я файлу з текстом програми "smess.c". Черга повідомлень створюється по отриманому раніше ключі із правами доступу для користувача на читання й запис, для інших дозволене тільки читання із черги.

Після створення черги повідомлень у буфер записується текст уведеного раніше повідомлення й установлюється тип повідомлення. Далі сервер пересилає сформоване повідомлення клієнтові й завершує роботу.

Трансляція сервера виробляється по командному рядку cc smess.c –o smess. У результаті компіляції й компонування формується виконується файл, щоМ, smess.

 

/* Сервер роботи з повідомленнями */

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int main()

{key_t key;

struct mybuf { long mtype; char mtext[81];} ;

struct mybuf buf;

int fd;

char text[81];

int textLen;

printf("Увести текст\n");

gets(text);

textLen=strlen(text);

if ((key=ftok("smess.c",0))==-1 )

{perror("Помилка створення ключа"); return 1; }

if ((fd=msgget(key, IPC_CREAT|0644))==-1)

{perror("Помилка створення черги");return 1; }

strncpy(buf.mtext, text, textLen); buf.mtype=1L;

if((fd=msgsnd(fd, &buf, textLen,0))==-1)

{perror("Помилка посилки повідомлення");return 1; }

return 0;

}

 

Програма - клієнт розміщається у файлі cmess.c.

Ця програма використовує для прийому повідомлення буфер buf, аналогічний серверу. Аналогічно серверу в ній по тім же рядку з ім'ям вихідного файлу сервера створюється ключ для доступу до черги. На відміну від сервера використовується існуюча черга, тому при виклику функції msgget() досить визначити лише значення ключа.

Для прийому повідомлення у функції msgrcv() задаються перші два параметри, значення прапорів і режиму можна встановити рівними нулю. Текст отриманого повідомлення виводиться на консоль.

 

/* Клієнт роботи з повідомленнями */

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int main()

{key_t key;

struct mybuf {long mtype; char mtext[81]; } ;

struct mybuf buf; int fd; char text[81]; int textLen;

if((key=ftok("smess.c",0))==-1 )

{perror("Помилка створення ключа"); return 1; }

if((fd=msgget(key, 0))==-1)

{perror("Помилка створення черги"); return 1; }

if((fd=msgrcv(fd, &buf, 80, 0, 0))==-1)

{ perror("Помилка прийому повідомлення"); return 1; }

printf("Отриманий текст -> %s\n",buf.mtext);

return 0;

}

 

Програма - клієнт запускається на окремій консолі. Для переходу на нову консоль необхідно нажати комбінацію клавіш Alt+Fn, де n - номер функціональної клавіші. Після створення консолі на ній виробляється звичайна реєстрація користувача. На першій консолі запускається клієнт (командний рядок ./cmess). На другій консолі запускається сервер (./smess).

 

Індівідуальні завдання

Написати дві програми, одна йз яких відіграє роль клієнта, друга служить сервером. Клієнт і сервер обмінюються між собою повідомленнями. Функції клієнта й сервера визначаються варіантами завдань на виконання лабораторної роботи.

1. Клієнт приймає із клавіатури команди й передає їхньому серверу. Сервер виконує прийняті команди й повертає результати їхнього виконання клієнтові. Прийняті дані клієнт виводить на термінал. Програми запускати на різних терміналах.

2. Клієнт запитує в сервера кількість працюючих у цей момент часу користувачів. Якщо кількість користувачів більше заданого числа на термінал виводиться повідомлення.

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

4. Клієнт передає серверу через канал запит у вигляді повного шляху до файлу. Сервер читає цей файл і передає клієнтові його вміст або повідомлення про помилку, якщо файл із зазначеним ім'ям не існує або не доступний для читання. Клієнт виводить прийняті дані на термінал.

5. Сервер виконує команду ps, і результати її виконання передаються клієнтові, що виводить їх на термінал.

6. Клієнт формує запит, що містить ім'я файлу. Сервер визначає, чи є зазначений файл каталогом і формує відповідну відповідь. Відповідь виводиться клієнтом на екран.

7. Клієнт формує серверу запит, що містить ім'я каталогу. Сервер перевіряє, чи є дозвіл запису в цей каталог, при необхідності встановлює це право й інформує клієнта про результати виконання операції. Клієнт виводить на екран отримане від сервера повідомлення.

8. Клієнт передає серверу запит у вигляді повного шляху до файлу. Сервер читає цей файл і передає клієнтові його вміст або повідомлення про помилку, якщо файл не існує або не доступний для читання. Клієнт записує отриману інформацію у файл у поточному каталозі з тим же ім'ям і доповнює його розширенням result.

9. Клієнт формує запит, що містить ім'я каталогу. Сервер переглядає каталог і передає клієнтові кількість підкаталогів, що мають у даному каталозі. Клієнт виводить отриману інформацію на екран.

10. Клієнт приймає із клавіатури команди й передає їхньому серверу. Сервер виконує ці команди, результати вертаються клієнтові, що записує їх у файл.

11. Клієнт запитує в сервера кількість файлів, що перебувають у зазначеному каталозі. Отриманий результат виводиться клієнтом на термінал.

12. Клієнт і сервер обмінюються повідомленнями, що вводяться із клавіатури. Програми запускаються на різних терміналах. Прийняті повідомлення виводяться на екран.

Література

1. Дансмур М. Операційна система UNIX і програмування мовою Си. / Дансмур М., Дейвис Г. - М.: Радіо й зв'язок, 1989. - 192 с.

2. Рейчард К. Linux: довідник / К. Рейчард, П. Фолькердинг. - Спб.: Питер Кін, 1999. - 480 с.

3. Робачевский А.М. Операційна система UNIX. - Спб.: BHV-Санкт-Петербург, 1997. - 528 с.

4. Стивенс У. UNIX: взаємодія процесів. - Спб.: Питер, 2003. - 576 с.

5. Теренс Чан Системне програмування на С++ для UNIX. К.: Видавнича група BHV, 1997. - 592 с.

6. Хэвиленд К., Грэй Д., Салама Б. Системне програмування в UNIX. Керівництво програміста. - М., ДМК Пресс, 2000. - 368 с.

7. Дансмур М. Операційна система UNIX і програмування мовою Си. / Дансмур М., Дейвис Г. - М.: Радіо й зв'язок, 1989. - 192 с.

8. Рейчард К. Linux: довідник / К. Рейчард, П. Фолькердинг. - Спб.: Питер Кін, 1999. - 480 с.

9. Робачевский А.М. Операційна система UNIX. - Спб.: BHV-Санкт-Петербург, 1997. - 528 с.

10. Стивенс У. UNIX: взаємодія процесів. - Спб.: Питер, 2003. - 576 с.

11. Теренс Чан Системне програмування на С++ для UNIX. К.: Видавнича група BHV, 1997. - 592 с.

12. Хэвиленд К., Грэй Д., Салама Б. Системне програмування в UNIX. Керівництво програміста. - М., ДМК Пресс, 2000. - 368 с.

13. Бовет Д., Чезати М. Ядро Linux. - Бхв-Петербург, 2007. - 1104 с.

14. В. Белунцов. Самовчитель користувача Linux. - Москва: "ДЕСС КОМУ", 2003. - 512 с.

15. Колисниченко Д.Н., Аллен П. В. Linux: Повне керівництво. - М., Наука й техніка, 2007 р. - 784 с.

16. Курячий Г. В., Маслинский К. А. Операційна система Linux. Курс лекцій. Навчальний посібник. - Інтернет-Університет інформаційних технологій, 2005. - 392 с.

17. Митчелл М. і ін. Програмування для Linux. Професійний підхід. - М., Діалектика, 2002 - 288 с.

18. Брюс Моли. Unix/Linux. Теорія й практика програмування. - М., Кудиц-Образ, 2004. - 576 с.

19. Роббинс А. Linux: програмування в прикладах. - М., Кудиц-Образ, 2005. - 656 с.

20. Секунов Н. Ю. Програмування на С++ в Linux. - Спб., Бхв-Петербург, 2003. - 354 с.

21. Скотт Максвелл. Ядро Linux у коментарях. - DiaSoft, 2000. - 488с.

22. Стивенс У.Р. UNIX: розробка мережних додатків. - Спб., Питер, 2007. - 1039 с.

23. Уолтон Ш. Створення мережних додатків у середовищі Linux. Керівництво розроблювача. - М., Вільямс, 2001.- 464 c.

24. Шахтарин Е. Операційна система Linux: передова технологія для всіх. - М., Вільямс, 2001.- 268 c.

25. Шредер К. Linux. Збірник рецептів. - Спб., Питер, 2006. - 432 с.

 

Жуковецька С.Л.,

Шестопалов С.В.

 

 

Системне програмування


Дата добавления: 2018-04-05; просмотров: 484; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!