ТЕМА: Взаимодействие процессов через канал FIFO
Целью работы является изучение межпроцессного взаимодействия через канал FIFO в операционной системе LINUX
Порядок подготовки к выполнению контрольной работы:
Идея многопроцессных (многопрограммных) операционных систем, к которым относится ОС LINUX, заключается в том, что на одной ЭВМ (псевдо)одновременно исполняется несколько программ (процессов). При этом считается, что процессы: 1) независимы и 2) ничего не знают о существовании друг друга. Каждому процессу выделяется свой набор ресурсов, которыми он монопольно владеет, и никто другой (кроме операционной системы) не имеет прямого доступа к ним.
Но могут ли возникнуть ситуации, когда одному процессу необходимо «сообщить» другому (или нескольким другим) процессу(-ам) какую-либо информацию. Кроме этого, процессу, например, может потребоваться:
К средствам межпроцессного взаимодействия (англ. Interprocess Communications, IPC), реализованных в операционной системе Linux, относятся:
Последний способ IPC позволяет реализовать взаимодействие между процессами, выполняющимися на разных ЭВМ, соединённых каналами передачи данных.
Все средства IPC условно можно разделить по типу процессов, участвующих во взаимодействии:
Именованные каналы. FIFO
Название каналов FIFO происходит от выражения First In First Out (первый вошёл, первый вышел). FIFO очень похожи на программные каналы, поскольку являются однонаправленным средством передачи данных, причём чтение данных происходит в порядке их записи. Однако в отличие от программных каналов, FIFO имеют имена, которые позволяют независимым процессам получить к этим объектам доступ. Поэтому иногда FIFO также называют именованными каналами. FIFO является отдельным типом файла в файловой системе UNIX (команда ls -l покажет символ «р» в первой позиции). Для создания FIFO используется системный вызов:
#include#include #include #include int mknod(char *pathname, mode_t mode, dev_t dev);
Где pathname – имя файла в файловой системе (имя FIFO), mode – флаги владения, прав доступа и т.д., dev при создании FIFO игнорируется. FIFO может быть создан и из командной строки shell:
$ mknod name p
После создания FIFO может быть открыт для записи и чтения, причём запись и чтение могут происходить в разных независимых процессах. Каналы FIFO и обычные каналы работают по следующим правилам:
В качестве примера приведём простейшую программу типа клиент-сервер, использующую FIFO для обмена данными. Следуя традиции, клиент посылает серверу сообщение «Здравствуй, Мир!», а сервер выводит это сообщение на терминал.
|
Листинг. Сервер |
|
|
1.
|
#include <sys/types.h> |
|
2.
|
#include <fcntl.h> |
|
3.
|
#include <stdio.h> |
|
4.
|
#include <sys/stat.h> |
|
5.
|
#define FIFO “fifo.1” |
|
6.
|
#define MAXBUFF 80 |
|
7.
|
|
|
8.
|
int main (void){ |
|
9.
|
int fd, n; |
|
10.
|
char buff[MAXBUFF]; /*буфер для
чтения данных */ |
|
11.
|
/*Создадим
специальный файл FIFO */ |
|
12.
|
if (mknod(FIFO,
S_IFIFO | 0666, 0) < 0){ |
|
13. |
printf(“Невозможно
создать FIFO\n”); |
|
14.
|
exit(1); |
|
15.
|
} |
|
16.
|
/*Получим
доступ к FIFO*/ |
|
17.
|
if ((fd =
open(FIFO, O_RDONLY)) < 0){ |
|
18. |
printf(“Невозможно
открыть FIFO\n”); |
|
19.
|
exit(1); |
|
20.
|
} |
|
21.
|
/*Прочитаем сообщение (“Здравствуй,
Мир!”)
*/ |
|
22.
|
/* и
выведем его на экран
*/ |
|
23.
|
while ((n = read(fd,
buff, MAXBUFF)) > 0) |
|
24. |
if (write(1, buff, n) != n){ |
|
25. |
printf(“Ошибка вывода\n”); |
|
26.
|
exit(1); |
|
27.
|
} |
|
28.
|
/* 3акроем
FIFO, и удалим файл */ |
|
29.
|
close(fd); |
|
30.
|
if (unlink(FIFO) < 0){ |
|
31.
|
printf(“Невозможно удалить FIFO\n”); exit(1); |
|
32.
|
} |
|
33.
|
exit(0); |
|
34.
|
} |
|
Листинг.
Клиент |
|
|
1.
|
#include <sys/types.h> |
|
2.
|
#include <sys/stat.h> |
|
3.
|
#include <stdio.h> |
|
4.
|
#include <fcntl.h> |
|
5.
|
|
|
6.
|
/*Соглашение об имени FIFO*/ |
|
7.
|
#define FIFO “fifo.1” |
|
8.
|
|
|
9.
|
int
main (void){ |
|
10. |
int fd, n; |
|
11. |
/*Получим доступ к FIFO*/ |
|
12. |
if ((fd =
open(FIFO, O_WRONLY)) < 0){ |
|
13. |
printf(“Невозможно
открыть FIFO\n”); |
|
14. |
exit(1); |
|
15. |
} |
|
16. |
/*Передадим сообщение серверу FIFO*/ |
|
17. |
if (write(fd,
“Здравствуй, Мир!\n\0”, 18) != 18){ |
|
18. |
printf(“Ошибка записи\n”); exit(1); |
|
19. |
} |
|
20. |
close(fd); |
|
21. |
exit (0); |
|
22. |
} |
Для разработки программ на языке Си в ОС LINUX не требуется установка какой-либо специальной среды разработки. Достаточно иметь любой текстовый редактор, например nano, и установить командную оболочку или попросту компилятор gcc.
Порядок шагов при разработке программы:
gcc имя_файла.с –о имя_файла.ехе -lm
nano имя_файла.с
./имя_файла.ехе
Так как по заданию к контрольной работе Вам следует разработать две программы, для каждой из них потребуется проделать шаги 3-8.
После получения exe-файлов каждой программы необходимо запустить их на выполнение так:
Номер варианта вашего задания должен совпадать с двумя последними цифрами пароля:
Если цифры пароля больше 35, то по аналогии с таблицей определите ваш вариант.
Задания на контрольную работу
|
№ варианта |
Задание на контрольную работу |
|
ВАРИАНТ 1 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны выполнять следующие
действия. 1)
Программа-Клиент отправляет серверу первое слово детской
считалки. Длина сообщения должна быть не более 15 символов Далее клиент ожидает ответа от
сервера. Работа клиента прекращается закрытием канала в случае поступления от
сервера любого ответа. 2)
Программа-Сервер получает
строку от клиента и отвечает на неё следующим образом: либо следующее слово
считалки, либо слово «Нет», если считалка неизвестна. Работа сервера
завершается отправкой сообщения клиенту и удалением канала. 3)
Весь диалог должен быть выведен
на экран. |
|
ВАРИАНТ 2. |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
отправляет серверу первую строчку Вашей любимой песни. Длина строки не должна
превышать 50 символов. Далее клиент ожидает ответа от сервера. Работа клиента
прекращается закрытием канала в случае поступления от сервера ответа. 2) Программа-Сервер
получает строку от клиента и отвечает на неё следующим образом: либо
следующее слово этой песни, либо «bye», Работа сервера
завершается в случае закрытием и уничтожением канала после отправления
ответа. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 3 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. . Программы должны
выполнять следующие действия. 1) Программа-Клиент отправляет серверу первое слово
стихотворения , либо слово «bye». Далее клиент ожидает ответа от
сервера. Работа клиента прекращается закрытием канала в случае поступления от
сервера ответа. 2) Программа-Сервер
получает строку от клиента и отвечает на неё следующим образом: либо
следующее слово стиха, либо, если получил – «bye»,
то – «bye». Работа сервера завершается закрытием и
уничтожением канала после отправления ответа. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 4 |
Написать две программы, реализующие механизм
взаимодействия типа клиент-сервер,
используя канал FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
предлагает пользователю ввести символьную строку, которая потом будет
отправлена серверу. Длина строки не должна превышать 40 символов. Далее
клиент ожидает ответа от сервера. Работа клиента прекращается закрытием
канала в случае поступления от сервера ответа. 2) Программа-Сервер
получает строку от клиента и отвечает на неё следующим образом: производит
замену в присланном сообщении всех букв «а» на «О» ,если
прислали – «bye», то – «bye».
Работа сервера завершается закрытием и уничтожением канала после отправления ответа. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 5 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
отправляет серверу любое слово. Длина
сообщения не должна превышать 15 символов. Далее клиент ожидает ответа от
сервера. Работа клиента прекращается закрытием канала в случае поступления от
сервера ответа. 2) Программа-Сервер
получает строку от клиента и отвечает на неё словом-перевертышем, либо, если получил – «bye»,
то – «bye». Работа сервера завершается закрытием и
уничтожением канала после отправки ответа. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 6 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
предлагает пользователю ввести символьную строку, которая потом будет
отправлена серверу. Длина строки не должна превышать 25 символов. Далее
клиент ожидает ответа от сервера. Работа клиента прекращается закрытием канала в случае поступления от
сервера ответа. 2) Программа-Сервер
получает строку от клиента и отвечает на неё как в игре « глухой телефон»,
заменяя любое случайно выбранное во фразе слова на «МММ», либо, если получил – «bye»,
то – «bye». Работа сервера завершается отправкой
ответа, закрытием и уничтожением канала. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 7 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы выполнять
следующие действия. 1) Программа-Клиент отправляет
серверу местоимение. Далее клиент ожидает ответа от сервера. Работа
клиента прекращается закрытием канала после получения ответа. 2) Программа-Сервер получает строку от клиента и отвечает на неё
следующим образом: если клиент прислал строку «Я», сервер отвечает «Ты», если
– «Он», то – «Она», если – «bye», то – «bye». Работа сервера завершается отправкой ответа,
закрытием и уничтожением канала. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 8 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
предлагает пользователю ввести имя, которое потом будет отправлено серверу.
Длина сообщения не должна превышать 20 символов. Далее клиент ожидает ответа от сервера.
Работа клиента прекращается закрытием канала после получения сообщения. 2) Программа-Сервер
получает строку от клиента и отвечает на неё следующим образом: если получил
женское имя ,
то отвечает мужским именем, если отправлено мужское имя, отвечает женским.
Тип имени передавать а структуре сообщения отдельным
полем с буковками «М» или «Ж». Если – «bye», то – «bye». Работа сервера завершается закрытием и уничтожением
канала после отправки сообщения. 3) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 9 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 4) Программа-Клиент отправляет
серверу сообщение, длина которого не должна превышать 60 символов.
Далее клиент ожидает ответа от сервера. Работа клиента прекращается закрытием
канала после получения ответа. 5) Программа-Сервер
получает строку от клиента и отвечает на неё заменяя
большие буквы на маленькие, если – «bye», то
– «bye». Работа сервера завершается в закрытием и уничтожением канала
после отправки ответа. 6) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 10 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны выполнять следующие
действия. 1)
Программа-Клиент отправляет серверу имя автора книги. Далее
клиент ожидает ответа от сервера. Работа клиента прекращается после получения
ответа закрытием канала. 2)
Программа-Сервер получает
строку от клиента и отвечает на неё следующим образом: если данные об этом
авторе у него есть, отвечает фразой «Я знаю этого автора», в противном случае
посылает фразу « Мне этот автор незнаком», либо, если получил – «bye», то – «bye». Работа
сервера завершается закрытием и уничтожением канала после отправки ответа. 3)
Весь диалог должен быть выведен
на экран. |
|
ВАРИАНТ 11 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 4) Программа-Клиент
предлагает пользователю ввести любое слово, которое потом будет отправлено
серверу. Далее клиент ожидает ответа от сервера. Работа клиента прекращается закрытием
канала после получения ответа. 5) Программа-Сервер
получает строку от клиента и отвечает на неё следующим образом: меняет в нем
все буквы «о» на «А», если такой буквы в слове не
оказалось, посылает в ответ строку «МММММ», если – «bye»,
то – «bye». Работа сервера завершается закрытием и
уничтожением канала после отправки ответа. 6) Весь
диалог должен быть выведен на экран. |
|
ВАРИАНТ 12 |
Написать
две программы, реализующие механизм взаимодействия типа клиент-сервер, используя канал
FIFO. Программы должны
выполнять следующие действия. 1) Программа-Клиент
предлагает пользователю ввести любое слово, которое потом будет отправлено
серверу. Далее клиент ожидает ответа от сервера. Работа клиента прекращается закрытием
канала после получения ответа. 2)
Программа-Сервер получает строку от клиента и
отвечает на неё следующим образом: меняет в нем все строчные буквы на
прописные, если таких буквы в слове не оказалось,
посылает в ответ строку «нет работы», если – «bye»,
то – «bye». Работа сервера завершается закрытием и
уничтожением канала после отправки ответа. 3) Весь
диалог должен быть выведен на экран. |
Содержание отчета с контрольной работой: