ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 33
- 34
- 35
- 36
- 37
- …
- следующая ›
- последняя »