2014-04-16 3 views
5

Ich habe folgende Erklärung in einigen Programmen gesehen, die meisten scheinen für Linux gemacht zu sein.lesen (fd, NULL, 0); was tut es? ist es klar definiert?

rv = read(fd, NULL, 0); 

In einigen Programmen ist es in einer Schleife, in einigen einer einzigen Anweisung.

Was macht es wirklich?

Man Seite sagt, dass ein Aufruf wie dies kann oder nicht auf Fehler überprüfen kann ...

Was ist die Bedeutung des Rückgabewertes?

Welche Arten von Dateideskriptoren werden unterstützt?

Und wenn rv==0 wie "kein Fehler" von z. "Steckdose geschlossen".

Antwort

7

Dieser Aufruf führt alle üblichen Fehlerüberprüfungen für den Dateideskriptor durch, ruft jedoch keine Daten daraus ab. Dies ist nützlich, wenn Sie beispielsweise feststellen möchten, ob der Dateideskriptor noch gültig ist, ohne ihn zu blockieren.

Es wird -1 zurückgegeben, wenn ein Fehler auftritt und andernfalls 0. Die meisten der in man 2 read aufgelisteten Fehler können auf diese Weise abgefragt werden und werden in errno zurückgegeben.

Zum Beispiel wird ein Rückgabewert von -1 und errno von EBADF zurückgesendet, wenn der Dateideskriptor geschlossen ist. Stattdessen wird der Rückgabewert 0 sein, wenn alles gut ist, und ein anderer read wird keinen Fehler zurückgeben, der mit der Gültigkeit des Dateideskriptors assoziiert ist.

Eine nachfolgende read mit einem echten Puffer und nbyte > 0 kann noch eine beliebige Anzahl von Fehlern wie ENOMEM erzeugen, EAGAIN, ...

+5

Es scheint grundsätzlich nicht tragbar. Die Seite von linux man (3) read sagt: 'Implementierungen sind erlaubt, aber nicht erforderlich, um eine Fehlerprüfung für read() - Anfragen von null Byte durchzuführen.POSIX sagt: Bevor irgendeine Aktion ausgeführt wird, und wenn nbyte gleich Null ist, wird gelesen() Funktion * kann * erkennen und Fehler zurückgeben. – Duck

Verwandte Themen