Ist O_NONBLOCK ist eine Eigenschaft des Dateideskriptor oder zugrunde liegenden Datei gesetzt?
-
04-10-2019 - |
Frage
Von dem, was ich habe auf der Open Group Webseite gelesen, auf
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 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 Wenn Sie Das Entfernen der Fehler aus dem Code der Handhabung zu reduzieren, müssen Sie: Nun sind beide fd0_dup und fds [0] beziehen sich auf die gleiche offene Dateibeschreibung (wegen der Daraus ergibt sich die beobachteten hier Verhalten von POSIX erforderlich ist. fcntl
open
, read
und
mkfifo()
) und ein Rohr (erstellt unter Verwendung pipe()
). open()
Funktionsaufruf erstellt eine neue, offene Dateibeschreibung und einen neuen Dateideskriptor das bezieht sich auf die offene Dateibeschreibung. 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 int fds[2];
pipe(fds);
int fd0_dup = dup(fds[0]);
fcntl(fd0_dup, F_SETFL, fcntl(fd0_dup, F_GETFL) | O_NONBLOCK);
dup()
), so dass die fcntl()
Betrieb beide Filedeskriptoren betroffen. if ((fcntl(fds[0], F_GETFL) & O_NONBLOCK)) { ... }