2016-09-12 4 views
2

ich einen Zeichengerätetreiber auf CentOS 7. Der Treiber implementiert habe normal funktioniert, wenn es von einem C-Programm aufgerufen wird, thusly ...Linux-Gerätetreiber mit falscher Zählung genannt

char bytes[8]; 
int fd = open("/dev/fortuna", O_RDONLY); 
if (fd < 0) { 
    perror("File open error: "); 
    return -1; 
} 
int in = read(fd, bytes, 8); 
if (in < 0) { 
    perror("File read error: "); 
} 
close(fd); 

Die Treiberfunktion las wird mit count = 8 aufgerufen und das Programm wird ohne Fehler abgeschlossen. Die Treiberfunktion Prototyp ...

static ssize_t fortuna_read(struct file *filp, char *buff, size_t count, loff_t *offp); 

Wenn jedoch das Lesen von einem C++ Strom aufgerufen wird, wie folgt ...

char bytes[8]; 
std::ifstream in("/dev/fortuna"); 
if (in.good()) { 
    in.read(bytes, 8); 
} 
in.close(); 

Die Treiberlesefunktion bei count = 8191 aufgerufen wird. wenn der Fahrer von einem Java-Filereader aufgerufen wird, wie folgt ...

File file = new File("/dev/fortuna"); 
file.setReadOnly(); 
FileReader reader = new FileReader(file); 
char[] cbuf = new char[8]; 
int read = reader.read(cbuf); 
reader.close(); 

der Fahrer Lesefunktion wird mit Zählung aufgerufen = 8192. die Schreibfunktionen ähnlich verhalten.

Google hat mich im Stich gelassen. Hilfe?

Antwort

2

Es hat mit der Pufferung zu tun. Ich bin mir ziemlich sicher, wenn Sie stdio.h und die Fopen() I/O-Familie anstelle von open() verwendet hätten, hätten Sie das gleiche Problem in C.

Also sollten Sie Puffer deaktivieren. Für C++ gibt es diese Antwort: How to disable buffering on a stream?

+0

Vielen Dank, mein Herr. Ihre Antwort führte mich auch zur Java-Lösung. – SteveB

1

Dank A.B, fand ich auch die Java-Lösung. FileReader ist ein gepufferter Reader. Die richtige zu verwendende Java-Klasse ist FileInputStream.