File descriptoren in c++
-
-
Wegen der Schule etc. hat ich diese Woche nicht so viel Zeit vielen Dank !
-
#define CDROM "/dev/cdrom" using namespace std; static int open_cd() { ifstream fin; filebuf f; f.open (CDROM,ios::in | ios::out); int fd = f.is_open(); if(fd==-1) cerr<<"Datei kann nicht geöffnet werden \n"; return fd; } static void open_tray (int cdrom) { if(ioctl (cdrom, CDROMEJECT)== -1) cerr<< "Geht nicht \n"; } int main() { int fd = open_cd(); open_tray(fd); }
Ich führs aus wird compiliert etc. bekomm dann ne meldung Geht nicht.
-
Wenn ich mal ein eigenes Betriebssystem schreibe, dann werden sämtliche Fehlermeldungen nur noch "Geht nicht" und "Funktioniert nicht" sein. Das ist viel anfängerfreundlicher.
-
Hat der ausführende Benutzer die passenden Rechte für /dev/cdrom? Auf den meisten gängigen Systemen ist diese Frage identisch mit: Ist der User Teil der Gruppe cdrom?
-
1. Dein Code ist nicht einmal richtig eingerückt. Damit fängt es an. Wenn du den Code nicht richtig einrückst, ist er unleserlich und du machst Fehler.
2. Das System sagt dir ja genau, was du falsch gemacht hast. Also lies auch die Fehlermeldung des Systems genau aus. Am einfachsten mit man: perror(3)
if(ioctl(...) == -1) { perror("ioctl"); }
int fd = f.is_open();
Das gibt dir nicht den Dateihandle zurück! Siehe http://www.cplusplus.com/reference/iostream/filebuf/is_open/
Nimm am besten man: open(2) anstelle die C++-Streams für Device-Sachen.
-
Euch ist schon aufgefallen dass hier versucht wird den bool-Rückgabewert von is_open() als Filedeskriptor zu nutzen, oder?
Antwort: Nimm open() und keine C++-Streams. Du willst weder etwas gepuffertes noch Abstraktionsebenen für die File-API.
-
Ich dachte mir das das auch mit den fstreams geht.
-
Hmm jetzt kommt Fehler :
Eject yourself
: input/output errorstatic int open_cd() { int fd = open(CDROM,O_RDONLY | O_NONBLOCK); if(fd == -1) { if(errno = ENOMEDIUM) printf("Keine CD im Laufwerk\n"); else perror("Fehler bei open()"); exit(EXIT_FAILURE); } return fd; } static void open_tray (int cdrom) { if(ioctl (cdrom, CDROMEJECT)== -1) { perror ("Eject yourself\n"); exit (EXIT_FAILURE); } } int main() { int fd = open_cd(); open_tray(fd); }
-
Hmm ?
-
Welche Header hast du denn überhaupt eingebunden?
Mir scheint als ob da noch was fehlen würde?
-
Ich habe die Lösung gefunden:
static int open_cd() { int fd = open(CDROM,O_RDONLY | O_NONBLOCK); if(fd == -1) { if(errno = ENOMEDIUM) printf("Keine CD im Laufwerk\n"); else perror("Fehler bei open()"); exit(EXIT_FAILURE); } return fd; } static void open_tray (int cdrom) { if(ioctl (cdrom, CDROM_LOCKDOOR, 0) < 0) { perror("Unlock door\n"); } if(ioctl (cdrom, CDROMEJECT)== -1) { perror ("Eject yourself\n"); exit (EXIT_FAILURE); } } int main() { int fd = open_cd(); open_tray(fd); }
Wichtig ist, das das Device nicht gemounted ist.
-
Unlock door : Device or resource busy Eject yourself : Input/output error
Weis meinste den damit wie kann ich das gucken obs gemountet ist ?
-
mach mal: (in der Konsole)
umount /dev/cdrom
und starte erst danach das Program.
-
pyhax schrieb:
if(errno = ENOMEDIUM) printf("Keine CD im Laufwerk\n");
Siehst du den Bug?
-
Jetzt versteh ich auch nichts mehr es ging die ganze Zeit nicht Laptop
abgestürzt und jetzt kommt das :Unblock door :Device or resource busy
Aber er öffnet den Laufwerk und mach was ich im sage xD