cat: Schreibfehler: Ungültiges Argument

cat: Schreibfehler: Ungültiges Argument

Schreiben auf ein benutzerdefiniertes Zeichengerät mit

Katze 123 > /dev/chardev

gibt

cat: Schreibfehler: Ungültiges Argument

Ich habe die Berechtigungen auf 666 geändert und es sogar mit sudo versucht. Immer noch die gleichen Ergebnisse. Habe auch echo auf ähnliche Weise versucht

Ich verwende Arch Linux 4.8.

Edit: Der Code für den Treiber

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h>


//Prototypes
static int __init init(void);
static void __exit cleanup(void);
static int device_open(struct inode *,struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

#define SUCCESS 0
#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices*/
#define BUF_LEN 80 /* Max length of the message from the device */

static int Major; //Major number of the devices
static int Device_Open = 0;

static char msg[BUF_LEN]; //Message given when asked
static char *msg_Ptr;

static struct file_operations fops = {
    .read = device_read,
    .write = device_write,
    .open = device_open,
    .release = device_release
};

static int __init init(){
    Major = register_chrdev(0,DEVICE_NAME,&fops);
    if(Major < 0){
        printk(KERN_ALERT "Failure in registering the device. %d\n", Major);
        return Major;
  }
    printk(KERN_INFO "%s registered with major %d \n",DEVICE_NAME,Major);
    printk(KERN_INFO "create a device with 'mknod /dev/%s c %d 0'\n",DEVICE_NAME,Major);
    printk(KERN_INFO "Try to cat and echo the file and shit man.\n");
    return SUCCESS;
}

static void __exit cleanup(){
    unregister_chrdev(Major, DEVICE_NAME);
    printk(KERN_ALERT "Unregistered the device %s i guess? \n"DEVICE_NAME);
}   

static int device_open(struct inode *inode,struct file *file){
    static int counter = 0;
    if(Device_Open)
        return -EBUSY;

    Device_Open++;
    sprintf(msg, "I already told you %d times Hello world!\n", counter++);
    msg_Ptr = msg;
    try_module_get(THIS_MODULE);
    return SUCCESS;
}

static int device_release(struct inode *inode,struct file *file){
    Device_Open--;
    module_put(THIS_MODULE);
    return 0;
}

static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset){
    int bytes_read = 0;
    if(*msg_Ptr == 0)
        return 0;
    while(length && *msg_Ptr){
        put_user(*(msg_Ptr++),buffer++);
        length--;   
        bytes_read++;
    }
    return bytes_read;
}

static ssize_t device_write(struct file *filp,const char *buff, size_t len, loff_t *off){
    printk(KERN_ALERT "You cannot write to this device.\n");
    return -EINVAL;
}

module_init(init);
module_exit(cleanup);

Hier können wir also sehen, dass ich sogar eine device_write-Funktion verwendet und sie in der fops-Struktur .write zugewiesen habe. Soll sie also nicht den Schreibbefehl akzeptieren und diese Anweisung im Protokoll drucken?

Antwort1

Im Kernel stellt jeder Treiber eine Reihe von Methoden für die verschiedenen Operationen bereit, die an einer Datei ausgeführt werden können: Öffnen, Schließen, Lesen, Schreiben, Suchen, ioctl usw. Diese Methoden werden in einemstruct file_operations. Für Geräte werden die Methoden vom Treiber bereitgestellt, der das jeweilige Gerät registriert hat (also die jeweilige Kombination aus Block/Zeichen, Hauptnummer und Nebennummer).

Ein Treiber kann nur einige der Methoden implementieren; es werden Standardwerte bereitgestellt. Die Standardwerte bewirken im Allgemeinen nichts und geben entweder Erfolg zurück (wenn es sinnvoll ist, für diese Methode nichts zu tun) oder EINVAL (wenn es keinen sinnvollen Standardwert gibt und das Fehlen einer Methode bedeutet, dass die Funktion nicht unterstützt wird).

„Schreibfehler: Ungültiges Argument“ bedeutet, dass die writeMethode des Treibers EINVAL zurückgibt. Die wahrscheinlichste Erklärung ist, dass dieser Treiber writeüberhaupt keine Methode hat. Es ist ziemlich üblich, dass Treiber bestimmte Aktionen nicht unterstützen. Beispielsweise unterstützen einige Treiber nur ioctl und nicht Lesen/Schreiben, einige Treiber sind von Natur aus unidirektional (z. B. ein Eingabegerät) und unterstützen nur Lesen und nicht Schreiben oder umgekehrt.

„Ungültiges Argument“ hat nichts mit Berechtigungen zu tun, sondern damit, was das Gerät tun kann. Sie würden einen Berechtigungsfehler erhalten, wenn Sie keine Schreibberechtigung hätten, aber Sie haben die Berechtigung, mit dem Treiber zu kommunizieren. Es ist nur so, dass das, was Sie vom Treiber verlangen, etwas ist, wovon er keine Ahnung hat.

verwandte Informationen