Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MET_VS~2.DOC
Скачиваний:
0
Добавлен:
10.11.2019
Размер:
271.87 Кб
Скачать

Програма 3.1

Іноді існує необхідність визначити походження процесу для коректного закриття програмного каналу. Це може бути здійснено за допомогою значення, яке повертається з функції fork (рядки 16 та 24, 25).

Більш гнучку систему використання програмних каналів можна отримати за допомогою потоків (програма 3.2).

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])

  3. {

  4. FILE *pipe_fp, *infile;

  5. char readbuf[80];

  6. if( argc != 3) {

  7. fprintf(stderr, "USAGE: popen3 [command] [filename]\n");

  8. exit(1);

  9. }

  10. /* Відкриття файла для читання */

  11. if (( infile = fopen(argv[2], "rt")) == NULL)

  12. {

  13. perror("fopen");

  14. exit(1);

  15. }

  16. /* Створення програмного каналу за допомогою системного виклику popen() */

  17. if (( pipe_fp = popen(argv[1], "w")) == NULL)

  18. {

  19. perror("popen");

  20. exit(1);

  21. }

  22. /* Реалізація циклу */

  23. do {

  24. fgets(readbuf, 80, infile);

  25. if(feof(infile)) break;

  26. fputs(readbuf, pipe_fp);

  27. } while(!feof(infile));

  28. fclose(infile);

  29. pclose(pipe_fp);

  30. return(0);

  31. }

Програма 3.2

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

  1. Назвіть основні механізми реалізації моделі типу "клієнт-сервер" в ОС Unix.

  2. Яке місце в реалізації моделі типу "клієнт-сервер" займають програмні канали?

  3. Що таке програмні канали з точки зору фізичного рівня, за яким принципом вони діють?

  4. Назвіть процес обміну інформацією між сервером та клієнтом. Властивості неіменованих каналів.

  5. Які зв'язки можуть встановлювати процеси та неіменовані канали?

  6. Які структури можуть встановлювати неіменовані канали?

  7. Які функції необхідні для створення неіменованого каналу?

  8. Поясніть призначення та роботу функцій write (рядок 21) та read (рядок 29) у програмі 3.1.

  9. Поясніть призначення та роботу функцій fgets (рядок 24) та fputs (рядок 26) у програмі 3.2.

Завдання

  1. Отримайте у викладача текст програми 3.2. Відкомпілюйте її під іменем progr3.

2. Введіть команди та запишіть результати роботи:

progr3 sort progr3.c

progr3 cat progr3.c

  1. Введіть команди Unix з консолі та запишіть результати роботи:

sort progr3.c

cat progr3.c

4. Опишіть різниці між двома (2 та 3) попередніми діями.

5. Спробуйте ввести помилкові аргументи (параметри) програми. Що виникне? Які рядки програми 3.2 відповідають за стеження введення параметрів?

  1. Підготуйте звіт по лабораторній роботі.

Зміст звіту:

- короткі відповіді на контрольні питання та завдання;

  • призначення програм 3.1 та 3.2;

  • алгоритм і текст програм 3.1 та 3.2.

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

Робота з поіменованими каналами. Реалізація технології "клієнт-сервер"

Мета роботи: розібрати програми роботи з іменованими кана­лами, привести приклад реалізування технології "клієнт-сервер", ознайомити з оперативним та фоновим режимами роботи.

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

Іменовані програмні канали надають більш широкі можливості в порівнянні з неіменованими. Після створення іменованого каналу ним можуть користуватися всі процеси, а не тільки "процеси-родичі". Для цього і існує ім'я каналу, яке може бути відоме всім процесам, котрі обмінюються інформацією. В цьому випадку ім'я каналу не отримують у спадок, як дескриптори відкритих каналів. Воно визначається один раз, відразу після створення каналу і стає доступним усім.

Іменовані програмні канали можуть бути створені не програмним шляхом. Для цього з системної консолі потрібно виконати команду:

mknod name p,

де р - ім'я каналу.

Після цього можна будь-що записати до каналу:

cat proba.txt > p

Зареєструйтесь на іншому терміналі:

Login: login_name

Password: password

Потім виконайте команду роздрукування змісту файла:

cat p

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

Створення іменованих програмних каналів можливе і програмним шляхом. Для цього необхідно скористатися функ­цією mknod:

mknod MYFIFO p

чи

mkfifo MYFIFO

Обидві команди досягають однієї мети: вони роблять іменований канал.

У прикладі файл MYFIFO ідентифікується фізичним файлом системи за допомогою літери "р".

При роздрукувані директорії ми побачимо:

$ls -l MYFIFO

prw-r--r-- 1 users user 0 Jan 14 16:28 MYFIFO|

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

Для створення програмного каналу на мові високого рівня Сі ми повинні використати функцію з трьома аргу­ментами, наприклад:

mknod("/mtp/MYFIFO", S_IFIFO|0666, 0);

де перший аргумент "/tmp/MYFIFO" - місцезнаходження та назва файла;

другий аргумент S_IFIFO|0666 - це заданий доступ до файла, який також може бути ефективним через встановлення функції umask, наприклад:

final_umask = request_permission & normal_umask;

або

flag = ((x & mask) != 0)

третій параметр (0) використовується дуже рідко і визначає головний чи другорядний номери приладів для файлів.

Приклад 4.1 демонструє роботу по створенню каналу програмним шляхом:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <sys/stat.h>

  4. #include <unistd.h>

  5. #include <linux/stat.h>

  6. #define FIFO_FILE "MYFIFO"

  7. int main(void)

  8. {

  9. FILE *fp;

  10. char readbuf[80];

  11. /* Створення каналу FIFO, якщо той не існує */

  12. umask(0);

  13. mknod(FIFO_FILE, S_IFIFO|0666, 0);

  14. while(1)

  15. {

  16. fp = fopen(FIFO_FILE, "r");

  17. fgets(readbuf, 80, fp);

  18. printf("Received string: %s\n", readbuf);

  19. fclose(fp);

  20. }

  21. return(0);

  22. }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]