Не удается записать в файл FIFO, отправленный через NFS - PullRequest
8 голосов
/ 24 июня 2009

Я пытаюсь записать в FIFO файл, найти его на NFS и он блокируется. В чем может быть проблема?

Мой / etc / export:

/tmp/test/ 10.0.0.0/24(rw,no_root_squash,async)

ls / tmp / test на сервере NFS и клиенте совпадают

prw--w--w- 1 root root 0 2009-06-24 17:28 ui-input

и я пишу как root

Спасибо.

Ответы [ 5 ]

7 голосов
/ 22 августа 2009

FIFO предназначен для межпроцессного взаимодействия. Пытаясь экспортировать FIFO через NFS, вы просите ядро ​​рассматривать локальное межпроцессное взаимодействие как нечто большее, чем механизм сетевого взаимодействия.

С этим связан ряд проблем, наиболее очевидным из которых является то, что реализация чтения FIFO внутри ядра ожидает буфера в пользовательском пространстве для копирования данных. Такой буфер не доступен напрямую в NFS. Таким образом, Ядро не поддерживает экспорт FIFO через NFS.

Вместо этого вы можете использовать сокеты для сетевого взаимодействия.

6 голосов
/ 11 марта 2010

Этот ответ, вероятно, слишком поздно, чтобы помочь вам сейчас, но примечательно, что вы могли бы добиться подобного эффекта, используя именованные каналы и команду "nc" (netcat). Netcat может принимать входные данные от стандартного ввода (или именованного канала) и выводить его через сокет на другой экземпляр netcat на другом хосте, необязательно на именованный канал.

Так что, в принципе, ваша установка будет выглядеть так:

Host1$ mkfifo Host1_named_pipe
Host1$ nc -l 1234 > Host1_named_pipe

Host2$ mkfifo Host2_named_pipe
Host2$ nc Host1 1234 < Host2_named_pipe

Теперь, когда вы запускаете программу на Host2 и отправляете ее вывод на Host2_named_pipe, этот вывод будет выходить из Host1_named_pipe на Host1.

или через ssh:

Host1$ mknode Host1_named_pipe p
Host2$ mknode Host2_named_pipe p

Host1$ cat Host1_named_pipe | ssh Host2 'cat - > Host2_named_pipe'
5 голосов
/ 24 июня 2009

Это названный fifo, но я думаю, он работает только в системе, где смонтирована файловая система. У вас есть читатель на этом fifo? Находятся ли писатель и читатель в одной системе?

fifo работает следующим образом: когда процесс открывает fifo, ядро ​​создает канал. Если другой процесс открывает fifo, ядро ​​узнает (из названия), что это тот же канал, что и ранее открытый.

Это не может работать на двух разных машинах. Т.е. если процесс A выполняется на client1, а процесс B - на client2, то процесс A и процесс B не могут обмениваться данными через fifo, поскольку на каждом компьютере создается fifo.

fifo не существует до тех пор, пока он не открыт, и он существует только локально, так как не влияет на содержимое файловой системы.

0 голосов
/ 11 марта 2010

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

Если вам нужна полная семантика Unix, вам нужно использовать что-то вроде RFS . Обратите внимание, что сложность и снижение производительности RFS по сравнению с переносимостью и 95% решением NFS сделали его в основном устаревшим. Рекомендуемое решение для межпроцессного взаимодействия между хостами - использовать сокеты в стиле BSD или потоки в стиле AT & T, в зависимости от среды вашей ОС. Для Linux используйте сокеты.

0 голосов
/ 24 июня 2009

У вас есть читатель на FIFO? FIFO будут блокироваться, пока на другом конце не будет что-то читать. (Обычные исключения для открытия в неблокирующем режиме применяются.)

...