Каналы (pipes)
Канал — механизм взаимодействия между родственными процессами; буфер в памяти ядра, который можно читать и в который можно записывать посредством связанных с ним файловых дескрипторов.
man 2 pipe:
#include <unistd.h>
int pipe(int pipefd[2]);
Системный вызов pipe при успешном завершении записывает в переданный ему массив
два числа — файловые дескрипторы, связанные с новым каналом. pipefd[0]
позволяет читать из канала, а pipefd[1]
— записывать в него.
Поведение операций в некоторых ситуациях:
read(...)
:- когда есть данные в буфере, возвращает эти данные;
- когда данных нет, но существует файловый дескриптор на запись в этот канал ("писатель"), блокируется и ждёт записи или закрытия писателей;
- когда данных и писателей нет, возвращает 0 (ситуация EOF).
write(...)
:- когда в буфере есть место для данных, записывает их туда;
- когда места нет, но существует файловый дескриптор на чтение из этого канала ("читатель"), блокируется и ждёт освобождения буфера или закрытия читателей;
- когда читателей нет, присылает пишущему процессу сигнал SIGPIPE.