КаталогИндекс раздела
НазадОглавлениеВперед


      

Лабораторная работа N4

Цель работы: освоение именованных программных каналов как способа обмена данными между процессами.

Именованные каналы

Именованные каналы (в UNIX их иногда называют FIFO) могут использоваться как средство взаимодействия между неродственными и даже удаленными процессами. Такой канал имеет внешнее имя, которое включается в пространство имен файловой системы. Поэтому именованный канал еще более похож на файл, чем неименованный. В системе канал представляется специальным файлом и создается специальным системным вызовом:

    int mknod(char *name, int mode, int dev);
Этот системный вызов может использоваться также и для создания обычных файлов, каталогов и других специальных файлов. Параметр name этого вызова является указателем на символьную строку, содержащую имя канала (имя может включать в себя также и путь). Параметр mode определяет тип создаваемого файла и режим доступа к нему. Старшие 7 бит этого числа определяют тип создаваемого файла (для именованного канала он может кодироваться макроконстантой: S_IFIFO, младшие 9 бит определяют права доступа "rwx" для владельца (старшая тройка), для группы (средняя тройка), для всех прочих (младшая тройка). Так, например, для канала, который будет доступен только для владельца, код параметра mode будет S_IFIFO|0x140, а для канала, доступного для всех-всех-всех - S_IFIFO|0x1B6. (Естественно, право "x" для канала не определяется.) Третий параметр при создании канала задается 0.

Далее при работе с именованным каналом используются файловые системные вызовы:

    int open(int *name, int oflag);
    int read(int pipe_fd, void *area, int cnt);
    int write(int pipe_fd, void *area, int cnt);
    int close(int pipe_fd);
Обратите внимание на то, что при открытии файла-канала могут быть заданы флаги открытия, среди которых может быть и флаг O_NDELAY. Если именованный канал открыт с этим флагом, то процесс, работающий с именованным каналом, не переходит в ожидание в тех случаях, которые приводят к приостанову процесса, работающего с неименованным каналом, - вместо этого системные вызовы read и write заканчиваются с признаком ошибки.

Именованный канал является постоянным объектом, он сохраняется даже после завершения создавшего его процесса и при необходимости должен быть уничтожаться явно - при помощи системного вызова:

    int unlink(char *name);

Постановка задачи

Для заданной в Вашем варианте индивидуального задания предметной области разработайте программную модель ситуации, включающей в себя следующее:

Отчет по лабораторной работе

Отчет по лабораторной работе должен содержать:

Пример выполнения работы N4 приведен здесь.


Назад ОглавлениеВперед
КаталогИндекс раздела