Question

J'ai compilé et exécuté l'exemple chardev.c de < a href = "http://tldp.org/LDP/lkmpg/2.6/html/index.html" rel = "nofollow noreferrer"> le lkmpg et lors de l'écriture sur le périphérique ont reçu une erreur inattendue:

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

La fonction d'écriture du module ressemble à ceci:

/*  
 * 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;
}

Je ne reçois pas l'erreur attendue d'une opération non valide et l'erreur imprimée dans / var / log / messages.

Je peux lire sans problème sur le périphérique et recevoir les résultats attendus:

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

Le périphérique / dev / chardev est créé manuellement à l'aide de:

sudo mknod /dev/chardev c 252 0

Quel est le problème?

- Modifier -

Apparemment, lorsque je dois créer le périphérique, les autorisations suivantes lui sont attribuées:

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

Une fois que j'ai fait sudo chmod a + w / dev / chardev , le pilote fonctionnait comme prévu.

Cependant, les gens ont dit que ce n’était pas correct de le faire.

Quel est le bon plan d'action et pourquoi?

Était-ce utile?

La solution

Vous trouverez un exemple très simple d'utilisation de la mise en œuvre de pilotes de personnage dans drivers / watchdog / softdog.c

Vous pouvez comparer votre code à cet exemple, qui montre comment procéder:

  • Lecture à partir du périphérique
  • Écrire sur le périphérique
  • Présenter une interface ioctl via le périphérique

Bien que softdog soit un outil très utile, c’est autant un tutoriel qu’autre chose. Alan Cox a présenté le tout ensemble, ce qui en fait un bon exemple de mise en œuvre plus "appropriée".

Si vous pouvez publier l'intégralité du code source dans votre module, nous pouvons vous aider à comprendre pourquoi votre fonction n'a pas été entrée comme prévu.

Mise à jour:

Il est parfaitement acceptable d'autoriser les utilisateurs sous-privilégiés à écrire sur des périphériques de personnage! Je le répète, il est parfaitement acceptable d'autoriser les utilisateurs sous-privilégiés à écrire sur des périphériques de personnage! Si ce n’était pas le cas, des éléments tels que FUSE, Modems, Gadgets USB, CD-ROM, etc. nécessiteraient un accès root pour pouvoir être utilisés.

Ce que vous pouvez faire est de tirer parti des appartenances au groupe . C'est-à-dire que sous Ubuntu, les utilisateurs autorisés à utiliser FUSE (système de fichiers dans l'espace utilisateur) doivent appartenir au groupe "fuse", ce qui permet un accès granulaire à ceux qui peuvent ou non utiliser cette fonctionnalité. De même, sur certains de mes systèmes, un QRNG (générateur de nombres aléatoires quantiques) est en cours d'utilisation .. et est (vous l'avez deviné) un appareil à caractères. Je dois autoriser PHP à accéder à cet appareil. Par conséquent, je:

  • Créer un groupe QRNG
  • Assurez-vous que PHP s'exécute en tant qu'utilisateur (utilisateurs non anonymes du système)
  • Ajouter des utilisateurs possédant des applications nécessitant un accès au périphérique au groupe QRNG

J'espère que ça s'éclaircit :)

Autres conseils

Je pense que le problème actuel est que la commande que vous avez lancée pour écrire est incorrecte. Essayez

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

Si vous souhaitez exécuter plusieurs commandes avec sudo, vous devez utiliser la commande comme indiqué ci-dessus. Avec cela, vous n'avez pas besoin de faire chmod et de changer ses permissions aussi. J'espère que cela t'aides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top