Kann nicht in FIFO-Datei schreiben, die über NFS erstellt wurde

8

Ich versuche in FIFO-Datei zu schreiben, finde auf NFS-Mount und es blockiert. Was könnte das Problem sein?

Mein / etc / export:

%Vor%

ls / tmp / Test auf NFS-Server und Client ist derselbe

%Vor%

und ich schreibe als root

Danke.

    
jackhab 24.06.2009, 14:36
quelle

5 Antworten

7

Ein FIFO soll ein prozessübergreifender Kommunikationsmechanismus sein. Wenn Sie versuchen, den FIFO über NFS zu exportieren, fordern Sie den Kernel auf, die lokale Kommunikation zwischen Prozessen als einen Netzwerkkommunikationsmechanismus zu betrachten.

Es gibt eine Reihe von damit verbundenen Problemen, von denen die offensichtlichste darin besteht, dass die FIFO-Lese-Implementierung im Kernel einen Puffer im Benutzerbereich erwartet, in den die Daten kopiert werden. Ein solcher Puffer ist in NFS nicht direkt verfügbar. Daher unterstützt der Kernel nicht den Export von FIFOs über NFS.

Sie können stattdessen Sockets für die Netzwerkkommunikation verwenden.

    
Divye Kapoor 22.08.2009 15:27
quelle
6

Diese Antwort ist wahrscheinlich zu spät, um Ihnen jetzt zu helfen, aber es ist bemerkenswert, dass Sie einen ähnlichen Effekt mit Named Pipes und dem Befehl "nc" (netcat) erreichen können. Netcat kann Eingaben von der Standardeingabe (oder einer Named Pipe) annehmen und sie über einen Socket an eine andere Instanz von Netcat auf einem anderen Host, optional an eine Named Pipe, zurückgeben.

Im Grunde würde Ihr Setup so aussehen:

%Vor%

Wenn Sie nun ein Programm auf Host2 ausführen und seine Ausgabe an Host2_named_pipe senden, wird diese Ausgabe aus Host1_named_pipe auf Host1 ausgegeben.

oder über ssh:

%Vor%     
jeremytrimble 11.03.2010 13:17
quelle
5

Es ist ein named fifo, aber ich denke, es funktioniert nur auf dem System, auf dem das Dateisystem gemountet ist. Hast du einen Leser auf diesem Fifo? Sind der Schreiber und der Leser auf dem gleichen System?

Der Fifo funktioniert so: Wenn ein Prozess den Fifo öffnet, erstellt der Kernel die Pipe. Wenn ein anderer Prozess den FIFO öffnet, dann weiß der Kernel (vom Namen), dass es dieselbe Pipe ist wie die zuvor geöffnete.

Dies kann nicht auf zwei verschiedenen Maschinen funktionieren. Dh wenn Prozess A auf Client1 läuft und Prozess B auf Client2 läuft, dann können Prozess A und Prozess B nicht über den Fifo kommunizieren, da auf jeder Maschine ein Fifo erstellt wird.

Das FIFO existiert nicht, bis es geöffnet wird, und es existiert nur lokal, es hat keine Auswirkung auf den Inhalt des Dateisystems.

    
shodanex 24.06.2009 14:54
quelle
0

Haben Sie einen Leser auf dem FIFO? FIFOs werden blockiert, bis am anderen Ende etwas gelesen wird. (Es gelten die üblichen Ausnahmen für das Öffnen im nicht blockierenden Modus.)

    
Duck 24.06.2009 14:55
quelle
0

NFS wurde als Multi-OS-Dateisystem mit dem kleinsten gemeinsamen Nenner entworfen. Als solche unterstützt nicht die vollständige Unix-Dateisystem-Semantik. Insbesondere werden FIFOs / Named Pipes, falls überhaupt verfügbar, nicht systemübergreifend verwendet. (Zwei Prozesse auf demselben Host können möglicherweise über einen NFS-FIFO kommunizieren, obwohl ich dies nicht empfehlen würde.)

Wenn Sie eine vollständige Unix-Semantik wünschen, müssen Sie etwas wie RFS verwenden. Beachten Sie, dass die Komplexität und die reduzierte Leistung von RFS im Vergleich zur Portabilität und 95% igen Lösung von NFS im Grunde genommen obsolet geworden sind. Die empfohlene Lösung für die Interprozesskommunikation zwischen Hosts ist die Verwendung von BSD-Sockets oder AT & amp; T-Stil-Streams, abhängig von Ihrer Betriebssystemumgebung. Verwenden Sie für Linux Sockets.

    
mpez0 11.03.2010 13:58
quelle

Tags und Links