Hallo Ich brauche Hilfe mit meinem Code für die Schule.Linux Kernel write() und read() Funktion
Die Lesefunktion sollte nie return 0
so Lehrer sagte uns wait_event_interruptible
zu verwenden.
Mein Problem ist, wenn ich es mit (für exmaple) Befehle in der Konsole versuchen:
echo 1234 > ringdev # my character device
echo 5 > ringdev
cat ringdev
ich nur ein Ergebnis: 5
.
Ich möchte ein Ergebnis erhalten:
1234 5
.
Die globalen Variablen:
static char ringdev_buf[4096];
static size_t ringdev_len;
lesen Funktion:
static ssize_t ringdev_read(struct file *filp, char __user *buf, size_t count,
loff_t *off)
{
ssize_t ret = 0;
while(1) {
wait_event_interruptible(head,ringdev_len!=0);
mutex_lock(&ringdev_lock);
if(ringdev_len!=0) {
ret = -EFAULT;
if (copy_to_user(buf, ringdev_buf,ringdev_len)) { // I was trying everything in the ringdev_len position.
ret = ringdev_len;
goto out_unlock;
}
}
mutex_unlock(&ringdev_lock);
}
out_unlock:
mutex_unlock(&ringdev_lock);
return ret;
}
Ich habe versucht, einen Wert in count in Funktion copy_to_user(buf, ringdev_buf,count)
aber das Ergebnis war immer das gleiche zu setzen.
static ssize_t ringdev_write(struct file *filp, const char __user *buf,
size_t count, loff_t *off)
{
ssize_t ret=0;
mutex_lock(&ringdev_lock);
ret=-EFAULT;
if(ringdev_len + count < sizeof(ringdev_buf)) {
if (copy_from_user(ringdev_buf+ringdev_len, buf, count)==0) {
ringdev_len=ringdev_len+count;
ret=count;
wake_up_interruptible(&head);
goto out_unlock;
}
} else {
ret=-ENOSPC;
}
out_unlock:
mutex_unlock(&ringdev_lock);
return ret;
}
Lesen sollte Benutzer den gesamten zu lesenden Puffer kopieren, nicht nur ein Zeichen. Passen Sie auch auf, wenn Sie warten, dass die Bedingung nach dem Warten noch nicht erfüllt ist; In diesem Fall sollten Sie -EINTR zurückgeben. Auf der Schreibseite sehen die Dinge wirklich gut aus. –
Auch erwarten wir 1234 \ n5 \ n, um den Inhalt nach den Echo-Befehlen zu sein (Katze würde 1234 und 5 in separaten Zeilen zeigen) –
@PaulStelian Post eine Antwort: p. – Stargateur