Операционные системы. Замятин А.В - 94 стр.

UptoLike

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

94
Команда mkfifo также создает канал FIFO. Ею можно пользоваться
в сценариях интерпретатора или из командной строки.
Живучесть каналов определяется живучестью процессов, т. е. канал
будет существовать до тех пор, пока он не будет принудительно закрыт
либо не останется ни одного процесса работающего с каналом.
После создания канал FIFO должен быть открыт на чтение или за-
пись с помощью либо функции open, либо одной из стандартных функ-
ций открытия файлов из библиотеки ввода-вывода (например, fopen).
FIFO может быть открыт либо только на чтение, либо только на запись.
Нельзя открывать канал на чтение и запись, поскольку именованные ка-
налы могут быть только односторонними (рис. 4.1).
Рис. 4.1. Взаимодействие двух процессов посредством каналов FIFO
При записи в программный канал или канал FIFO вызовом write
данные всегда добавляются к уже имеющимся, а вызов read считывает
данные, помещенные в программный канал или FIFO первыми. При вы-
зове функции lseek для программного канала или FIFO будет возвраще-
на ошибка ESPIPE.
Неименованные каналы создаются вызовом pipe() и предоставляют
возможность только однонаправленной (односторонней) передачи данных:
#include <unistd.h>
int fd[2];
pipe(fd);
/* возвращает 0 в случае успешного завершения, -1 - в случае ошибки;*/
Функция возвращает два файловых дескриптора: fd[0] и fd[l], при-
чем первый открыт для чтения, а второй для записи.
Хотя канал создается одним процессом (рис. 4.2), он редко исполь-
зуется только этим процессом, каналы обычно используются для связи
между двумя процессами (родительским и дочерним) следующим обра-
зом: процесс создает канал, а затем вызывает fork, создавая свою копию
дочерний процесс (рис. 4.3); затем родительский процесс закрывает от-