MKFIFO(3)

ИМЯ
mkfifo, mkfifoat - создают специальный файл очереди(FIFO), так же известный как именованный канал

ОБЗОР
#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);

#include <fcntl.h>           /* определения констант AT_* */
#include <sys/stat.h>

int mkfifoat(int dirfd, const char *pathname, mode_t mode);

Требования макроса тестирования свойств для glibc (смотрите feature_test_macros(7)):

mkfifoat():
    Начиная с glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    До glibc 2.10:
        _ATFILE_SOURCE

ОПИСАНИЕ
mkfifo() создаёт специальный файл очереди с именем pathname и правами доступа mode. Однако значение umask процесса переопределяет итоговое значение: по умолчанию права на создаваемый файл присваиваются по формуле (mode & ~umask).

Специальный файл очереди подобен каналу, за исключением самой мелочи - он создается другим вызовом mkfifo(). Очередь - это Вам не какой-то безымянный канал передачи данных, а файл имеющий собственное место в файловой системе, созданное вызовом mkfifo().

Как только Вы создаите специальный файл очереди то, любой процесс может попытаться открыть его для чтения или записи, как если бы он открывал обычный файл. Однако прежде чем вы сможете что либо сделать очередь необходимо открыть с обоих концов притом одновременно. Открытие очереди для чтения обычно блокируется, пока какой нибудь другой процесс не открывает туже самую очередь для записи, и наоборот. Если вы хотите работать без блокировок, то вам следует прочитать про очередь(7) - специальный файл очереди.

  mkfifoat()
Системный вызов mkfifoat() работает также как системный вызов mkfifo(), за исключением случаев, описанных здесь. Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в mkfifo(3)). Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как mkfifo(3)). Если в pathname задан абсолютный путь, то dirfd игнорируется.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении вызовы mkfifo() и mkfifoat() возвращают 0. В случае ошибки возвращают -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EACCES
    Один из каталогов содержащихся в pathname не позволяет выполнить поиск, так как правами запрещено исполнение.

EDQUOT
    Исчерпана пользовательская квота на дисковые блоки или иноды файловой системы.

EEXIST
    pathname уже существует. В этом случае pathname может быть символьной ссылкой, повисшей или нет.

ENAMETOOLONG
    Если длина полного имени файла (включая путь) pathname больше чем PATH_MAX или длина имени файла больше чем NAME_MAX. В общем случае в системах, соответствующих стандарту GNU, отсутствует ограничение на длину полного имени файла, однако некоторые файловые системы могут устанавливать ограничение на длину отдельного компонента.

ENOENT
    Один из каталогов в pathname не существует или является повисшей символьной ссылкой.

ENOSPC
    В каталоге или файловой системе закончились места для новых файлов.

ENOTDIR
    Компонент пути, использованный как каталог в pathname, в действительности таковым не является.

EROFS
    pathname указывает на файловую систему, доступную только для чтения.

Следующие дополнительные ошибки могут быть характерны для mkfifoat():

EBADF
    dirfd не является правильным файловым дескриптором.

ENOTDIR
    pathname является относительным путем, а dirfd является файловым дескриптором, указывающим на файл, отличный от каталога.

ВЕРСИИ
mkfifoat() включен в glibc в версии 2.4. Осуществляется с использованием mknodat(2), который доступен в Linux начиная с версии ядра 2.6.16.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
mkfifo(), mkfifoat() | Безвредность в нитях | MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ
mkfifo(): POSIX.1-2001, POSIX.1-2008. mkfifoat(): POSIX.1-2008.

СМОТРИТЕ ТАКЖЕ
mkfifo(1), close(2), open(2), read(2), stat(2), umask(2), write(2), fifo(7)