- •Исследование моделей взаимодействия процессов именованные каналы
- •1. Цель работы
- •2. Краткие теоретические сведения
- •2.1 Именованные каналы
- •2.2 Открытие именованного канала
- •2.3 Удаление файлов
- •2.4 Пример программы
- •3. Задания на лабораторную работу
- •5. Порядок выполнения лабораторной работы
- •6. Содержание отчета о выполнении лабораторной работы
- •7. Порядок защиты работы
- •8. Контрольные вопросы
- •Библиографический список
- •Приложение а (справочное) текст программы lr6_client
- •4. ТехническиЕ средствА для выполнения работы.
- •Приложение б (справочное) Текст программы lr6_server
4. ТехническиЕ средствА для выполнения работы.
Компьютерный класс с установленными ОС WINDOWS и виртуальными машинами позволяющими запускать ОС Linux.
5. Порядок выполнения лабораторной работы
Произвести запуск виртуальной машины и загрузку в ней операционной системы LINUX.
Произвести регистрацию с именем пользователя и паролем, указанным преподавателем.
В меню «Устройства» виртуальной машины выбрать пункт «Общий буфер обмена» и настроить режим «Из основной в гостевую ОС»
Создать в пользовательском каталоге два пустых текстовых файла с расширением .с.
Перенести текстовые файлы с программами из приложений А и Б в созданные файлы.
Откомпилировать программы с помощью gcc (gcc имя.c -o имя).
Произвести запуск программы (./имя )
Ввести исходные данные и получить упакованное слово состояния устройства.
Создать и отладить программу, соответствующую варианту задания.
6. Содержание отчета о выполнении лабораторной работы
Отчёт должен содержать:
- титульный лист;
- цель лабораторной работы;
- задание соответствующее варианту;
- текст программы;
- результаты работы программы;
- выводы.
Отчёт по лабораторной работе должен быть выполнен в соответствии требованиями ГОСТ.
7. Порядок защиты работы
Защита производится при наличии отчета за компьютером и состоит в демонстрации работы программы в соответствии с вариантом задания.
8. Контрольные вопросы
Что такое канал?
Что такое FIFO?
Как создать именованный канал??
Для чего служит файл метка FIFO?
С помощью какого системного вызова можно удалить файл?
С помощью какого системного вызова можно изменить права доступа текущего процесса?
Как организовать передачу данных от одного процесса другому через именованный канал?
С помощью каких системных вызовов можно организовать запись в файл, чтение из файла?
Каково назначение системного вызова open()?
Что представляет собой модель взаимодействия «клиент-сервер».
Библиографический список
Белецкий Я. Энциклопедия языка Си / Я. Белецкий, пер. с пол. А. Д. Плитман, ред. Ф. Ф. Пащенко. - М.: Мир, 1992. - 686 c.
Бондаренко М. Ф. Системное программирование в современных операционных системах: учебное пособие для студентов вузов / М. Ф. Бондаренко [и др.]. - Харьков: Компания СМИТ, 2005. - 432 с.
Бек Л. Введение в системное программирование / Л. Л. Бек; Ред. Л. Н. Королев, Пер. с англ. Н. А. Богомолов. - М.: Мир, 1988. - 448 с.
Приложение а (справочное) текст программы lr6_client
* Программа клиент осуществляющая связь через FIFO */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int fd1,fd2, result, c, f, b, n;
char reg[1];
size_t size;
unsigned short mas[4]; /* массив для передачи по каналу */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
unsigned short pack_word[1];/* массив для упакованного числа */
int nmas_pack = sizeof pack_word; /* количество байт, занимаемых массивом упа-кованным*/
char name1[]= "a.fifo"; /* имя канала для записи */
char name2[]= "b.fifo"; /* имя канала для чтения */
/* Обнуляем маску создания файлов текущего процесса для того,
чтобы права доступа у создаваемого FIFO точно соответствовали
параметру вызова mknod() */
(void)umask(0);
/* главный цикл */
while(1){
printf("Введите код режима работы (u / p) >");
scanf("%s",®);
printf("Введите код состояния (0 - 31) >");
scanf("%hd",&c); mas[0]=c;
printf("Введите признак ошибки (0 / 1) >");
scanf("%hd",&f); mas[1]=f;
printf("Введите признак занятости (0 / 1) >");
scanf("%hd",&b); mas[2]=b;
printf("Введите кол-во переданных байт (0 - 255) >");
scanf("%hd",&n); mas[3]=n;
/* открываем FIFO на запись.*/
if((fd1 = open(name1, O_WRONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for writing\n");
exit(-1);
}
/* Пробуем записать в FIFO nmas байт */
size = write(fd1, mas, nmas);
if(size != nmas){
/* Если записалось меньшее количество байт,то сообщаем
об ошибке и завершаем работу */
printf("Can\'t write all string to FIFO\n");
exit(-1);
}
/* Закрываем входной поток данных и на этом родитель
прекращает работу */
close(fd1);
/* Открываем
FIFO на чтение.*/
if((fd2 = open(name2, O_RDONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for reading\n");
exit(-1);
}
/* Пробуем прочитать из FIFO в массив */
size = read(fd2, pack_word, nmas_pack);
if(size < 0){
/* Если прочитать не смогли, сообщаем об ошибке
и завершаем работу */
printf("Can\'t read string\n");
exit(-1);
}
/* Печатаем прочитанную строку */
printf("%hu\n",pack_word[0]);
/* Закрываем входной поток и завершаем работу */
close(fd2);
}
printf("client exit\n");
return 0;
}
