Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 35 стр.

UptoLike

Составители: 

35
Каналы и FIFO-файлы
Каналэто один из механизмов UNIX, предназначенный для связи между
процессами. Данные, записанные в канал одним процессом могут быть считаны другим
процессом. Данные поступают в канал и выдаются из него в порядкепервым пришел,
первым вышел”. Канал не имеет имени и создается для однократного использования.
FIFO-файлы схожи с каналами, но в отличие от каналов они не являются
временными соединениями между процессами и имеют одно или несколько имен как у
любого файла операционной системы. Процессы открывают FIFO-файл используя его
имя.
Каналы и FIFO-файлы должны быть открыты двумя взаимодействующими
процессами независимо. При чтении из канала или FIFO-файла, в который ни один
поток не записывает данные (например, если файл или канал уже был закрыт), операция
чтения возвращает символ конца файла. Запись в канал, не имеющий ни одного
процесса, выполняющего операцию чтения трактуется как ошибка и генерирует сигнал
SIGPIPE и завершается с кодом ошибки, равным EPIPE, если сигнал обрабатывается
или заблокирован.
Ни каналы ни FIFO-файлы не имеют механизма позиционирования указателя. И
чтения и запись осуществляются последовательно. Чтение выполняется из начала
файла, записьв конец файла.
Создание канала
Для создания канала служит функция pipe. Она используется для открытия
канала и на чтение и на запись. Обычно процесс создает канал до создания
порожденных процессов, с которыми он будет взаимодействовать через канал. Канал
может использоваться для взаимодействия как между родительским и порожденным
процессами, так и между двумя равноправными процессами.
Функция pipe определена в заголовочном файле <unistd.h>:
int pipe(int FILEDES[2])
Функция создает поток и помещает дескрипторы файлов для чтения из потока и
записи в поток соответственно в FILEDES[0] и FILEDES[1]. В случае успешного
выполнения функция возвращает значение 0, при возникновении ошибки возвращается
–1, в переменная errno может принимать следующие значения:
EMFILE процесс имеет слишком много открытых файлов;
ENFILE система имеет слишком много открытых файлов. В Linux эта ошибка
никогда не возникает.
Приведем пример создания канала. Программа использует функцию fork для
создания порожденного процесса. Родительский процесс записывает данные в канал,
которые считывает порожденный процесс.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void read_from_pipe (int file)
{
FILE *stream;
int c;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF)
putchar (c);
fclose (stream);
}
       Каналы и FIFO-файлы
        Канал – это один из механизмов UNIX, предназначенный для связи между
процессами. Данные, записанные в канал одним процессом могут быть считаны другим
процессом. Данные поступают в канал и выдаются из него в порядке “первым пришел,
первым вышел”. Канал не имеет имени и создается для однократного использования.
        FIFO-файлы схожи с каналами, но в отличие от каналов они не являются
временными соединениями между процессами и имеют одно или несколько имен как у
любого файла операционной системы. Процессы открывают FIFO-файл используя его
имя.
        Каналы и FIFO-файлы должны быть открыты двумя взаимодействующими
процессами независимо. При чтении из канала или FIFO-файла, в который ни один
поток не записывает данные (например, если файл или канал уже был закрыт), операция
чтения возвращает символ конца файла. Запись в канал, не имеющий ни одного
процесса, выполняющего операцию чтения трактуется как ошибка и генерирует сигнал
SIGPIPE и завершается с кодом ошибки, равным EPIPE, если сигнал обрабатывается
или заблокирован.
        Ни каналы ни FIFO-файлы не имеют механизма позиционирования указателя. И
чтения и запись осуществляются последовательно. Чтение выполняется из начала
файла, запись – в конец файла.

       Создание канала
       Для создания канала служит функция pipe. Она используется для открытия
канала и на чтение и на запись. Обычно процесс создает канал до создания
порожденных процессов, с которыми он будет взаимодействовать через канал. Канал
может использоваться для взаимодействия как между родительским и порожденным
процессами, так и между двумя равноправными процессами.
       Функция pipe определена в заголовочном файле :
       int pipe(int FILEDES[2])
         Функция создает поток и помещает дескрипторы файлов для чтения из потока и
записи в поток соответственно в FILEDES[0] и FILEDES[1]. В случае успешного
выполнения функция возвращает значение 0, при возникновении ошибки возвращается
–1, в переменная errno может принимать следующие значения:
EMFILE        процесс имеет слишком много открытых файлов;
ENFILE        система имеет слишком много открытых файлов. В Linux эта ошибка
              никогда не возникает.
         Приведем пример создания канала. Программа использует функцию fork для
создания порожденного процесса. Родительский процесс записывает данные в канал,
которые считывает порожденный процесс.
       #include   
       #include   
       #include   
       #include   

       void read_from_pipe (int file)
       {
         FILE *stream;
         int c;
         stream = fdopen (file, "r");
         while ((c = fgetc (stream)) != EOF)
           putchar (c);
         fclose (stream);
       }


                                                                                35