Wie kann () auf regulären Dateideskriptoren (Nicht-Sockets) warten?

8

Dies ist das Codebeispiel von "man select" plus ein paar Zeilen, um eine tatsächliche Datei zu lesen, in die geschrieben wird. Ich vermutete, dass, wenn% code_% geschrieben wird, ./myfile.txt zurückgeben würde, dass es jetzt von diesem fd lesen kann. Aber was passiert, ist, dass select ständig in der while-Schleife zurückkehrt, solange die txt-Datei existiert. Ich möchte, dass es nur zurückkehrt, wenn neue Daten am Ende der Datei geschrieben werden. Ich dachte, so sollte es funktionieren.

%Vor%     
glutz 10.08.2012, 12:41
quelle

1 Antwort

13

Die Festplattendateien sind immer bereit zum Lesen (aber der Lesevorgang gibt möglicherweise 0 Byte zurück, wenn Sie sich bereits am Ende der Datei befinden). Daher können Sie select() auf einer Festplattendatei, um herauszufinden, wann neue Daten zur Datei hinzugefügt werden.

POSIX sagt:

  

Mit normalen Dateien verknüpfte Dateideskriptoren müssen immer true für Ready to Read, Ready to Write und Error Conditions auswählen.

Wie cnicutar in einem jetzt gelöschten Post angegeben wurde, müssen Sie das FD_SET im Allgemeinen initialisieren jede Iteration. In Ihrem Code überwachen Sie ein fd, und dieses fd ist immer bereit, also ändert sich das FD_SET tatsächlich nicht. Wenn Sie jedoch 5 zu überwachende Deskriptoren haben und select feststellt, dass nur einer bereit ist, wird bei der nächsten Iteration nur dieser eine Deskriptor überwacht (es sei denn, Sie setzen FD_SET zurück). Dies macht die Verwendung von select tricky.

    
Jonathan Leffler 10.08.2012, 12:57
quelle

Tags und Links