Device File öffnen mit C/POSIX

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Device File öffnen mit C/POSIX

    Im Dokument von Apple mit dem Titel "Device File Access Guide for Storage Devices" ist ein Beispiel, wie man mit dem POSIX-Befehl open ein Device-File einer CD-ROM öffnet. Ich habe versucht, damit das Device der Boot-Partition zu öffnen, funktioniert aber leider nicht.

    In der Shell gebe ich mount ein, raus kommt:
    /dev/disk0s2 on / (hfs, local, journaled)

    In C schreibe ich dann:
    fileDescriptor = open( "/dev/disk0s2", O_RDONLY );

    Das geht natürlich nur mit entsprechenden Rechten, ich führe mein Programm als root aus. Es kommt trotzdem eine -1 zurück, errno ist EBUSY (device or file busy).

    Gibt es einen Trick, um die Boot-Partition trotzdem öffnen zu können? Schliesslich gibt es eine Menge Programme, die eine Harddisk z.B. nach verlorenen Files scannen, die müssen doch bestimmt auch direkt auf das Device zugreifen. Wenn's geht, möchte ich lieber nicht eine andere API z.B. IOKit verwenden müssen, sondern möglichst mit POSIX-Befehlen auskommen.

    Any ideas???
  • Hier funktioniert das wunderbar, wenn man das "raw device" benutzt:

    C-Quellcode

    1. #include <fcntl.h>
    2. #include <stdio.h>
    3. int main() {
    4. int x = open( "/dev/rdisk0s2", O_RDONLY );
    5. printf("HANDLE: %i\n",x);
    6. }


    $ ./a.out
    HANDLE: -1

    $ sudo ./a.out
    HANDLE: 3

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von system ()

  • Du greifst direkt auf die Partition zu und nicht über ein Dateisystem.
    Du musst nicht unbedingt die raw Geräte Datei öffnen, sondern kannst dem Treiber mitteilen, dass du
    auf die Partition direkt zugreifen möchtest und zwar mit dem Flag O_DIRECT.

    Dennoch könnte der zugriff über dieses Flag fehlschlagen, wenn der Treiber dieses Flag nicht kennt.


    fileDescriptor = open( "/dev/disk0s2", O_RDONLY | O_DIRECT );
    Inos ist ein Gott aus Gothic, dem Spiel.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Inos ()

  • Danke, versuche es auch noch mit O_DIRECT.
    Ich habe nun allerdings ein anderes Problem. Wenn ich mit read vom Device lese in Megabytes-Chunks, dann funktioniert's prima. Wenn ich hingegen zwei einzelne Bytes zu lesen versuche, schlägt's fehl. Zuerst dachte ich, das Problem wäre, dass open/read kein Caching macht, und habe deshalb den Code für fopen/fread umgeschrieben. Aber auch hier geht's schief. read resp. fread setzt jeweils EINVAL. (Mein Code funktioniert, wenn ich nämlich eine Datei (Image) statt ein Device öffne, läuft alles korrekt ab.)
  • digory schrieb:

    Wenn ich hingegen zwei einzelne Bytes zu lesen versuche, schlägt's fehl.

    Bei den "raw devices" muss man immer ganze Blöcke lesen. Ich meine das waren entweder 512 Bytes oder 4 Kilobytes. Da ein Megabyte ein vielfaches hiervon ist, funktioniert das zufällig.

    Beim normalen Zugriff (also auf /disk statt /rdisk und vermutlich darf man auch O_DIRECT nicht benutzen) sollte man auch einzelne Bytes lesen können, aber dazu müsste man die Partition unmounten, weil das Betriebssystem immer nur einen Buffercache auf ein Device haben will, um nicht durcheinander zu kommen.

    Stell dir nur mal vor, du liest 2 Bytes aus einem Block und dann änderst du etwas in dem Block über das gemountete Dateisystem und liest dann wieder 2 Bytes aus dem Block. Da kriegst du immer noch den alten Wert, weil der Block im Cache liegt, obwohl sich die Werte auf der Platte schon geändert haben. Mac OS will dir das einfach nicht antun und schaltet diese Funktion deswegen für bereits in Benutzung befindliche "devices" ab.
  • Habe das mit O_DIRECT mal versucht, geht leider nicht, da die Konstante nicht definiert ist. Es scheint, das ist eine Spezialität von Linux und in Darwin nicht implementiert. Oder ist sie in einem anderen Header File zu finden?

    Das mit den einzelnen Bytes ist ein wenig kacke, weil ich das Device ja nur zum lesen öffne und einfach stets die aktuellen Daten haben will. Wenn jemand gleichzeitig auf die Platte schreibt, gibt's halt Salat, aber das ist ja auch nicht zu verhindern, wenn ich blockweise lese...