ВУЗ:
Составители:
253
После создания канал 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); затем родительский процесс закрывает от-
крытый для чтения конец канала, а дочерний – открытый на запись ко-
нец канала (рис. 4.4). Это обеспечивает одностороннюю передачу дан-
ных между процессами (рис. 4.5)
Страницы
- « первая
- ‹ предыдущая
- …
- 251
- 252
- 253
- 254
- 255
- …
- следующая ›
- последняя »
