Frage

ich kompiliert und lief der chardev.c Beispiel von < a href = "http://tldp.org/LDP/lkmpg/2.6/html/index.html" rel = "nofollow noreferrer"> die lkmpg und wann das Gerät einen unerwarteten Fehler beim Schreiben erhalten:

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied

Das Modul Schreibfunktion sieht wie folgt aus:

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/chardev 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
    return -EINVAL;
}

Ich bin nicht die erwartete Fehler ungültiger Operation bekommen und den Fehler zu bedruckenden / var / log / messages.

ich von dem Gerät ohne Probleme lesen kann, die erwarteten Ergebnisse Empfang:

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!

Das Gerät / dev / chardev erstellt wird manuell mit:

sudo mknod /dev/chardev c 252 0

Was ist das Problem?

- Bearbeiten -

Offenbar, wenn ich das Gerät erstellen mknod endet es mit den folgenden Berechtigungen auf:

crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev. 

Sobald ich sudo chmod a+w /dev/chardev tat der Fahrer arbeitete wie erwartet.

Allerdings haben die Menschen gesagt, es nicht korrekt ist, dies zu tun.

Was ist die korrekte Vorgehensweise und warum?

War es hilfreich?

Lösung

Ein wirklich, wirklich, wirklich einfach und einfaches Beispiel, wie Zeichen Treiber implementieren kann in drivers/watchdog/softdog.c gefunden wird

Sie können den Code zu diesem Beispiel vergleichen, sehen Sie, wie folgendes tun:

  • Lesen vom Gerät
  • Schreiben an das Gerät
  • Geben Sie eine ioctl-Schnittstelle über das Gerät Präsentieren

Während softdog ein sehr nützliches Werkzeug ist, sein so viel ein Tutorial als irgendetwas anderes. Alan Cox warf sie zusammen, so dass sie ein gutes Beispiel für mehr ‚richtige‘ Umsetzung.

Wenn Sie die ganze Quelle zu Ihrem Modul veröffentlichen können, können wir Ihnen helfen, herauszufinden, warum Ihre Funktion wird wie erwartet nicht eingegeben zu werden.

Update:

Es ist perfekt akzeptabel unter privilegierten Benutzern zu erlauben, Zeichengeräte zu schreiben! Ich wiederhole, es ist durchaus akzeptabel zu ermöglichen, unter privilegierten Benutzern Charakter Geräte zu schreiben! Ist dies nicht der Fall war, Sachen wie FUSE, Modems, USB-Gadgets, CD-ROMS und andere Dinge würden Root-Zugriff erforderlich zu verwenden.

Was können Sie tun, ist in Anspruch nehmen Gruppe Mitgliedschaften. Das heißt, auf Ubuntu, Benutzer erlaubt FUSE (Filesystem in Userspace) zu verwenden, um die ‚Sicherung‘ Gruppe angehören sollen, die auf granulare Zugriffs erlaubt wer kann und nicht diese Funktion nutzen können. In ähnlicher Weise auf einige meiner Systeme, ein QRNG (Quantenzufallszahlengenerator) verwendet wird .. und ist (Sie ahnen es) ein Zeichengerät. Ich brauche PHP zu ermöglichen, dass das Gerät zugreifen zu können, so I:

  • Erstellen Sie eine QRNG Gruppe
  • Stellen Sie sicher, PHP läuft als Benutzer (nicht anonyme Systembenutzer)
  • Fügen Sie Benutzer besitzen Apps, die Zugriff auf das Gerät an die QRNG Gruppe benötigen

Ich hoffe, dass klärt ihn auf:)

Andere Tipps

Ich denke, eigentliches Problem ist der Befehl, die Sie zu schreiben, ausgestellt ist falsch. Versuchen

#sudo sh -c "echo "hi" > /dev/chardev"

Wenn Sie mehrere Befehle mit sudo ausführen möchten, dann sollten Sie Befehl verwenden, wie oben gezeigt. Damit sind, tragen müssen Sie chmod und ihre Berechtigungen ändern und tun. Hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top