Frage

Ich habe einen Dateideskriptor, die zum Lesen geöffnet ist, die nicht blockierend sein können. Was ich tun müssen, ist einfach alle Daten lesen bis zum Erreichen EOF und schreiben, die Daten auf eine beschreibbare Dateideskriptor. Da der Prozess, dass führt diesen Kopier nicht „bewusst“ ist alles, was auf um sie geht, glaube ich nicht, dass ich etwas Nützliches tun kann, während auf Daten warten, und ich will nicht, eine while Schleife verwenden (während errno ist nicht EAGAIN), weil ich denke, dass es eine Verschwendung wäre. Gibt es eine Möglichkeit oder auf andere Weise zu blockieren Ausführung des Kopierprozesses auszusetzen, bis die Daten verfügbar sind?

War es hilfreich?

Lösung

Ihre andere Antwort einfach führt zum Löschen O_NONBLOCK, die die Datei zurück auf Sperrung setzt. Das ist völlig in Ordnung, wenn das funktioniert in Ihrer Situation; aber wenn nicht, können Sie select() zu blockieren, bis die nicht-blockierenden Dateideskriptor lesbar verwenden.

Andere Tipps

Kapitel 7 des Linux SCSI Generic (sg) HOWTO gibt ein Beispiel , wie dies zu tun:

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top