Каналы (pipes)

Канал — механизм взаимодействия между родственными процессами; буфер в памяти ядра, который можно читать и в который можно записывать посредством связанных с ним файловых дескрипторов.

man 2 pipe:

#include <unistd.h>

int pipe(int pipefd[2]);

Системный вызов pipe при успешном завершении записывает в переданный ему массив два числа — файловые дескрипторы, связанные с новым каналом. pipefd[0] позволяет читать из канала, а pipefd[1] — записывать в него.

Поведение операций в некоторых ситуациях:

  • read(...):
    • когда есть данные в буфере, возвращает эти данные;
    • когда данных нет, но существует файловый дескриптор на запись в этот канал ("писатель"), блокируется и ждёт записи или закрытия писателей;
    • когда данных и писателей нет, возвращает 0 (ситуация EOF).
  • write(...):
    • когда в буфере есть место для данных, записывает их туда;
    • когда места нет, но существует файловый дескриптор на чтение из этого канала ("читатель"), блокируется и ждёт освобождения буфера или закрытия читателей;
    • когда читателей нет, присылает пишущему процессу сигнал SIGPIPE.