Wie können Sie einen Schreibvorgang mithilfe eines Dateideskriptors löschen?

Es stellt sich heraus, dass dieses ganze Missverständnis von open () und fopen () von einem fehlerhaften I2C-Treiber im Linux 2.6.14-Kernel auf einem ARM herrührt. Das Zurückportieren eines funktionsfähigen bitbasierten Treibers löste die Hauptursache des Problems, das ich hier ansprechen wollte.

Ich versuche, ein Problem mit einem seriellen Gerätetreiber unter Linux (I2C) herauszufinden. Es scheint, dass durch das Hinzufügen von zeitgesteuerten OS-Pausen (Sleep) zwischen Schreiben und Lesen auf dem Gerät die Dinge besser funktionieren.

Aside: Die Natur von I2C ist, dass jedes vom Master gelesene oder geschriebene Byte vom Gerät am anderen Ende der Leitung (Slave) bestätigt wird - die Pausen, die die Dinge verbessern, regen mich an, den Treiber als asynchron zu betrachten - etwas, das ich kann nicht vereinbaren, wie der Bus funktioniert. Anyhoo ...

Ich möchte entwederspüle das Schreiben um sicher zu gehen (anstatt eine Pause mit fester Dauer zu verwenden),ode irgendwie testen, dass die Schreib- / Lesetransaktion @ habgeschlosse in einer Multi-Thread-freundlichen Art und Weise.

Die Probleme mit der Verwendung vonfflush(fd); bedeutet, dass 'fd' ein Streamzeiger sein muss (kein Dateideskriptor), d. h.

FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);

Mein Problem ist, dass ich die Verwendung des @ benötigioctl(), das keinen Stream-Zeiger verwendet. d.h.

int fd = open("filename",O_RDWR);
ioctl(fd,...);

Vorschläge

Antworten auf die Frage(6)

Ihre Antwort auf die Frage