2016-12-28 3 views
0

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; 
} 
+0

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. –

+0

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) –

+0

@PaulStelian Post eine Antwort: p. – Stargateur

Antwort

1

Berufung des copy_to_user (buf, ringdev_buf, 1) bewirkt, dass 1 Byte Kopie von ringdev_buf bis buf, so dass ihr Recht, wenn Sie gesamten Puffer zu User-Space kopieren möchten, müssen Sie es copy_to_user ändern (buf, ringdev_buf , ringdev_len)

+0

Ich habe es geändert, aber ich bekomme es noch: – Akihito

+0

Ich habe es geändert, aber ich bekomme immer noch nur die letzte Echoantwort – Akihito

+0

sollte es sein opy_to_user (buf, ringdev_buf, ringdev_len) nicht opy_to_user (buf, ringdev_buf, 4096) –

0
if (copy_to_user(buf, ringdev_buf,ringdev_len)) 

sollte sein:

if (copy_to_user(buf, ringdev_buf,ringdev_len)==0) 

zusätzlich, kann ich nicht richtig char Gerät gemacht hat. Aber danke für Hilfe :). Wenn jemand etwas braucht, kann ich hier meine Schreib-/Lesefunktion auf einen zyklischen Puffer schreiben, wo jedes Think korrekt funktioniert.

Verwandte Themen