Frage

Von dem, was ich habe auf der Open Group Webseite gelesen, auf fcntl open , read und

War es hilfreich?

Lösung

O_NONBLOCK ist eine Eigenschaft der geöffneten Datei Beschreibung, nicht der Dateideskriptor, noch der zugrundeliegenden Datei.

Ja, könnten Sie separate Datei-Deskriptoren haben geöffnet für die gleiche Datei, von denen blockiert und von denen der andere ist nicht blockiert wird.

Sie müssen zwischen einem FIFO unterscheiden (erstellt mit mkfifo() ) und ein Rohr (erstellt unter Verwendung pipe() ).

Beachten Sie, dass der Sperrstatus ist eine Eigenschaft der ‚offenen Dateibeschreibung‘, aber in den einfachsten Fällen gibt es eine Eins-zu-Eins-Abbildung zwischen Filedeskriptoren und offene Dateibeschreibungen. Der open() Funktionsaufruf erstellt eine neue, offene Dateibeschreibung und einen neuen Dateideskriptor das bezieht sich auf die offene Dateibeschreibung.

Wenn Sie dup() , Sie haben zwei Dateideskriptoren teilen sich ein offene Dateibeschreibung und die Eigenschaften gehören in der offenen Dateibeschreibung. Die Beschreibung des fcntl() sagt, dass F_SETFL die offene Dateibeschreibung mit der damit verbundenen Auswirkungen Dateideskriptor. Beachten Sie, dass lseek() Regelt die Dateiposition der offenen Beschreibungsdatei mit der zugehörigen Dateideskriptor -. so dass es wirkt sich auf andere Datei-Deskriptoren von der ursprünglichen dupliziert

Das Entfernen der Fehler aus dem Code der Handhabung zu reduzieren, müssen Sie:

int fds[2];
pipe(fds);
int fd0_dup = dup(fds[0]);
fcntl(fd0_dup, F_SETFL, fcntl(fd0_dup, F_GETFL) | O_NONBLOCK);

Nun sind beide fd0_dup und fds [0] beziehen sich auf die gleiche offene Dateibeschreibung (wegen der dup()), so dass die fcntl() Betrieb beide Filedeskriptoren betroffen.

if ((fcntl(fds[0], F_GETFL) & O_NONBLOCK)) { ... }

Daraus ergibt sich die beobachteten hier Verhalten von POSIX erforderlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top