Целью работы является изучение межпроцессного взаимодействия через канал FIFO в операционной системе LINUX

Порядок подготовки к выполнению контрольной работы:

  1. Если еще не установили, установить на свой компьютер ОС LINUX (как рекомендовано в лабораторной работе№2).
  2. Повторить основы языка Си: работа с файлами (см. курс «Информатика»)
  3. Проделать лабораторную работу №2, предложенную в данном курсе.

Теория

Часть 1.

Идея многопроцессных (многопрограммных) операционных систем, к которым относится ОС LINUX, заключается в том, что на одной ЭВМ (псевдо)одновременно исполняется несколько программ (процессов). При этом считается, что процессы: 1) независимы и 2) ничего не знают о существовании друг друга. Каждому процессу выделяется свой набор ресурсов, которыми он монопольно владеет, и никто другой (кроме операционной системы) не имеет прямого доступа к ним.

Но могут ли возникнуть ситуации, когда одному процессу необходимо «сообщить» другому (или нескольким другим) процессу(-ам) какую-либо информацию. Кроме этого, процессу, например, может потребоваться:

  • сообщить о своей готовности обработать данные;
  • «поделиться» с другим процессом объемом выполняемой работы или взять часть работы другого процесса на себя;
  • обеспечить строгую последовательность работы нескольких процессов (например, чтобы начисление процентов на счете в банке производилось только после его пополнения);
  • и т.п.

К средствам межпроцессного взаимодействия (англ. Interprocess Communications, IPC), реализованных в операционной системе Linux, относятся:

  • ожидание завершения родственного процесса;
  • сигналы;
  • каналы (именованные и неименованные);
  • очереди сообщений;
  • семафоры;
  • разделяемая память;
  • сокеты.

Последний способ IPC позволяет реализовать взаимодействие между процессами, выполняющимися на разных ЭВМ, соединённых каналами передачи данных.

Все средства IPC условно можно разделить по типу процессов, участвующих во взаимодействии:

  • «любой процесс». Ресурсы 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 и обычные каналы работают по следующим правилам:

  1. При чтении меньшего числа байтов, чем находится в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.
  2. При чтении большего числа байтов, чем находится в канале или FIFO, возвращается доступное число байтов. Процесс, читающий из канала, должен соответствующим образом обработать ситуацию, когда прочитано меньше, чем заказано.
  3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если один или более процессов открыли канал для записи, вызов read будет заблокирован до появления данных (если для канала или FIFO не установлен флаг отсутствия блокирования O_NDELAY).
  4. Запись числа байтов, меньшего ёмкости канала или FIFO, гарантированно атомарно. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются.
  5. При записи большего числа байтов, чем это позволяет канал или FIFO, вызов write блокируется до освобождения требуемого места. При этом атомарность операции не гарантируется. Если процесс пытается записать данные в канал, не открытый ни одним процессом на чтение, процессу генерируется сигнал SIGPIPE, а вызов write возвращает 0 с установкой ошибки (errno=EPIPE) (если процесс не установил обработку сигнала SIGPIPE, производится обработка по умолчанию, и процесс завершается).

В качестве примера приведём простейшую программу типа клиент-сервер, использующую 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.  

}

Часть 2. Основные этапы создания программы в ОС LINUX

Для разработки программ на языке Си в ОС LINUX не требуется установка какой-либо специальной среды разработки. Достаточно иметь любой текстовый редактор, например nano, и установить командную оболочку или попросту компилятор gcc.

Порядок шагов при разработке программы:

  1. Войти в систему LINUX.
  2. Выбрать на панели монитора режим «терминал».
  3. nano (вызов редактора для создания нового файла).
  4. Создать новый файл, содержащий текст вашей программы:
  5. Записать набранный текст программы в файл имя_файла.с на диск.
  6. Провести компиляцию программы. Вызвать компилятор так
  7. 								gcc   имя_файла.с   –о   имя_файла.ехе  -lm
    							
  8. Если в процессе компиляции обнаружены ошибки - исправить их, вызвав редактор
  9. 								nano   имя_файла.с
    							
  10. Сохранить скорректированный текст в прежнем файле и повторить компиляцию.
  11. Выполнить программу. Для этого в командной строке наберите
  12. 								./имя_файла.ехе
    							

Так как по заданию к контрольной работе Вам следует разработать две программы, для каждой из них потребуется проделать шаги 3-8.

После получения exe-файлов каждой программы необходимо запустить их на выполнение так:

  • Открыть два терминальных окна.
  • В одном из них запустить первой программу-сервер (как показано в шаге 9)
  • Во втором терминальном окне запустить программу-клиент.
  • Наблюдаете результаты их взаимодействия.

Номер варианта вашего задания должен совпадать с двумя последними цифрами пароля:

Если цифры пароля больше 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)    Весь диалог должен быть выведен на экран.

 


Содержание отчета с контрольной работой:

  1. Титульный лист
  2. Текст вашего варианта задания.
  3. Текст программ с комментариями (как в примере)
  4. Скриншоты экранов с результатами совместной работы программ.
  5. В отчете представить скриншоты различных исходов взаимодействия разработанных программ.