Wie können Sie einen Schreibvorgang mit einem Dateideskriptor löschen?
Es stellt sich heraus, das ganze Missverständnis der open() und fopen (), stammt aus einem buggy I2C-Treiber im Linux-2.6.14-kernel auf einem ARM. Zurückportieren eine funktionierende bit eingeschlagen Treiber gelöst die Ursache des Problems habe ich versucht-Adresse hier ein.
Ich versuche, herauszufinden, ein Problem mit einem seriellen Gerät-Treiber in Linux (I2C). Es scheint, dass durch das hinzufügen von zeitgesteuerten OS Pausen (schläft) zwischen den schreib-und Lesevorgängen auf dem Gerät Dinge funktionieren ... (viel) besser.
Beiseite: Die Natur von I2C ist, dass jedes byte gelesen oder geschrieben durch die Meister bestätigt, indem das Gerät am anderen Ende der wire (slave) - die Pausen, die Verbesserung der Dinge, die mich ermutigen, zu denken, die Fahrer arbeiten asynchron - etwas, dass ich nicht abstimmen kann, wie der bus funktioniert. Anyhoo ...
Ich würde entweder gerne flush das schreiben, um sicher zu sein (anstatt mit fester Dauer pause), oder irgendwie testen, dass der schreib/lese-Transaktion hat abgeschlossen in einem multi-threaded-freundliche Art und Weise.
Das Problem mit fflush(fd);
ist, dass es erfordert 'fd' stream-Zeiger (kein file-Deskriptor), d.h.
FILE * fd = fopen("filename","r+");
... //do read and writes
fflush(fd);
Mein problem ist, dass ich verlange, dass die Nutzung der ioctl()
die nicht mit einem stream-Zeiger. also
int fd = open("filename",O_RDWR);
ioctl(fd,...);
Vorschläge?
InformationsquelleAutor der Frage Jamie | 2008-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Möglichkeiten:
Verwenden
fileno()
zum abrufen der Datei-Deskriptor zugeordnet, mit derstdio
stream-ZeigerNicht verwenden
<stdio.h>
überhaupt, so dass Sie nicht brauchen, um über flush - alle Schreibvorgänge gehen, um das Gerät sofort aus, und für Zeichen-Geräte, diewrite()
rufen gar nicht zurück, bis die untere-level-IO abgeschlossen ist (in der Theorie).Für die device-level-IO würde ich sagen, es ist ziemlich ungewöhnlich zu verwenden
stdio
. Würde ich dringend empfehlen, mit der unteren Ebeneopen()
read()
undwrite()
Funktionen statt (basierend auf deiner späteren Antwort):InformationsquelleAutor der Antwort Alnitak
Ich denke was du suchst ist möglicherweise
oder
fsync
wird, Spülen Sie die Datei aus dem kernel-Puffer auf die Festplatte.fdatasync
auch tun, außer für die meta-Daten.InformationsquelleAutor der Antwort Danke Xie
fflush()
nur spült die Pufferung der stdio -fopen()
Schicht, verwaltet von derFILE *
Objekt. Die zugrunde liegende Datei selbst, gesehen durch den kernel, nicht gepuffert auf dieser Ebene. Dies bedeutet, dass schreibt unter Umgehung desFILE *
Schicht, mitfileno()
- und eine raw -write()
sind auch nicht gepuffert, in einer Weise, dassfflush()
würde erröten.Wie andere haben darauf hingewiesen, versuchen nicht das mischen der beiden. Wenn Sie verwenden müssen, um "rohe" I/O-Funktionen wie
ioctl()
dannopen()
die Datei selbst direkt, ohne mitfopen<()
und Freunde aus stdio.InformationsquelleAutor der Antwort unwind
Es klingt wie das, was Sie suchen, ist die fsync() Funktion (oder fdatasync()?), oder du könntest das O_SYNC-flag in Ihrem open () - Aufruf.
InformationsquelleAutor der Antwort jstedfast
Wenn Sie möchten, zu gehen die andere Weise Runde (associate-DATEI* mit den bestehenden file-Deskriptor), verwenden Sie fdopen() :
InformationsquelleAutor der Antwort Arkadiy
Haben Sie versucht, das deaktivieren der Pufferung?
InformationsquelleAutor der Antwort rustyx