Руководство программиста для Linux

    778b1c86   

Создание FIFO


Есть несколько способов создания именованного канала. Первые два могут быть осуществлены непосредственно из shell-а. mknod MYFIFO p mkfifo a=rw MYFIFO

Эти две команды выполняют идентичные операции, за одним исключением. Команда mkfifo предоставляет возможность для изменения прав доступа к файлу FIFO непосредственно после создания. При использовании mknod будет необходим вызов команды chmod.

Файлы FIFO могут быть быстро идентифицированы в физической файловой системе посредством индикатора "p", представленного здесь в длинном листинге директории. $ ls -1 MYFIFO ^prw-r--r-- 1 root root 0 Dec 14 22:15 MYFIFO| ...

Также заметьте, что вертикальный разделитель располагается непосредственно после имени файла. Другая веская причина запустить Linux, eh?

Чтобы создать FIFO на Си, мы можем прибегнуть к использованию системного вызова mknod(): LIBRARY FUNCTION: mknod(); PROTOTYPE: int mknod( char *pathname, mode_t mode, dev_t dev ); RETURNS: 0 в случае успеха, -1 в случае ошибки: errno = EFAULT (ошибочно указан путь) EACCESS (нет прав) ENAMETOOLONG (слишком длинный путь) ENOENT (ошибочно указан путь) ENOTDIR (ошибочно указан путь) (остальные смотрите в man page для mknod) NOTES: Создает узел файловой системы (файл, файл устройства или FIFO)

Оставим более детальное обсуждение mknod()-а man page, а сейчас давайте рассмотрим простой пример создания FIFO на Си: mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);

В данном случае файл "/tmp/MYFIFO" создан как FIFO-файл. Требуемые права - это "0666", хотя они находятся под влиянием установки umask, как например: final_umask = requested_permissions & ~original_umask ...

Общая хитрость - использовать системный вызов umask() для того, чтобы временно устранить значение umask-а: umask(0); mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);

Кроме того, третий аргумент mknod()-а игнорируется, в противном случае мы создаем файл устройства. В этом случае он должен отметить верхнее и нижнее числа файла устройства.



Содержание раздела