2016-08-04 18 views
1

Ich schreibe einen Treibercode, um einige Registerwerte von x86 zu lesen., Als ich meine User-Space-Anwendung lief habe ich den folgenden Fehler.ioctl Fehler beim Öffnen von Char dev-Datei

ioctl: Ungeeignete ioctl für Geräte

hier ist der Code sniff ..

fd = open_drvfile(); 
if(ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start) == -1) { 
    perror("ioctl:"); 
    exit (0); 
} 

und open_drvfile() nur offen (erstellen und offen) die char-Datei wie unten

fd = open("/dev/" DEV_NAME, O_RDWR|O_CREAT); 
if (fd == -1) { 
    perror("Failed to open /dev/" DEV_NAME); 
} 
return fd; 

kann ich einen Punkt, an dem ich einen Fehler gemacht habe?

+0

Ich verstehe nicht ganz, was Sie zu tun versuchen, aber da Sie auf ein Char-Gerät im Fragetitel verweisen, ist das O_CREAT-Flag unter der open() nicht sinnvoll für mich. Hast du das char Gerät mit 'mknod()' vor 'open()' erstellt? – pah

+1

Ich benutze open(), um die Datei zu erstellen und zu öffnen (da die Datei nicht bereits vorhanden ist). Ich denke, das war falsch. Nachdem ich deine Antwort gesehen habe, habe ich mknod() verwendet, um eine Datei zu erstellen und O_CREAT entfernt, jetzt funktioniert es wie erwartet. Vielen Dank. –

+0

Ich werde die Antwort posten, so dass es für andere hilfreich sein kann :) – pah

Antwort

0

Ein char Gerät bedeutet, dass es mit mknod() erstellt werden soll, und nicht mit O_CREAT unter open()flags (die eine reguläre Datei erstellen wird, ist kein Zeichen Gerät).

(siehe Frage Kommentare).