Ich schreibe einen einfachen Linux-USB-Zeichentreiber, der es erlaubt, einen kurzen String vom Geräteknoten zu lesen, den er erstellt.Warum liest Files.readAllBytes zuerst mit einer Bufsize von 1?
Es funktioniert gut, aber ich bemerkte einen Unterschied zwischen dem Lesen von dem Gerät Knoten mit cat
und Lesen von einem Java-Programm mit Files.readAllBytes.
kernel: [46863.186331] usbtherm: Device was opened
kernel: [46863.186407] usbtherm: buffer: 131072, read: 5, offset: 5
kernel: [46863.186444] usbtherm: done, returning 0
kernel: [46863.186481] usbtherm: Device was released
mit Files.readAllBytes
, eine Pufferlese mit:
mit cat
Lese, ein Puffer mit einer Größe von 131072 an dem ersten Aufruf die file_operations.read
Funktion und der 5 Byte String kopiert gebenen Beim ersten Aufruf wird Größe 1 übergeben, dann wird ein Puffer der Größe 8191 übergeben und die restlichen 4 Byte werden kopiert:
kernel: [51442.728879] usbtherm: Device was opened
kernel: [51442.729032] usbtherm: buffer: 1, read: 1, offset: 1
kernel: [51442.729102] usbtherm: buffer: 8191, read: 4, offset: 5
kernel: [51442.729140] usbtherm: done, returning 0
kernel: [51442.729158] usbtherm: Device was released
Die file_operations.read
Funktion (einschließlich der Debugging printk
‚s) ist:
static ssize_t device_read(struct file *filp, char *buffer, size_t length,
loff_t *offset)
{
int err = 0;
size_t msg_len = 0;
size_t len_read = 0;
msg_len = strlen(message);
if (*offset >= msg_len)
{
printk(KERN_INFO "usbtherm: done, returning 0\n");
return 0;
}
len_read = msg_len - *offset;
if (len_read > length)
{
len_read = length;
}
err = copy_to_user(buffer, message + *offset, len_read);
if (err)
{
err = -EFAULT;
goto error;
}
*offset += len_read;
printk(KERN_INFO "usbtherm: buffer: %ld, read: %ld, offset: %lld\n",
length, len_read, *offset);
return len_read;
error:
return err;
}
Die Zeichenfolge in beiden Fällen lesen ist identisch, so dass ich denke, es ist okay, ich frage mich nur, warum das unterschiedliche Verhalten?
Können Sie sehen, was 'size()' für Ihren Geräteknoten zurückgibt? – Arjan