Tom: C++: (File)locking für IO-Streams

Hello,

kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking betreiben kann? Habe mal wieder den ganzen Tag gesucht, und leider nur halbgares Zeug gefunden.

Außerdem suche ich eine Übersicht über alle gängigen Libs und Klassenbibliotheken, die es für C++ gibt, inclusive Interfaces (Header-files) und deren aussagefähiger Beschreibung. Ich habe mich bisher an http://cplusplus.com orientiert, aber da fehlt mir doch noch etliches...

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
  1. Hi,

    kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking betreiben kann?

    Tut mir leid, das ist mir weder in C noch in C++ untergekommen. Kann es sein, dass das Locking automatisch geschieht?

    Außerdem suche ich eine Übersicht über alle gängigen Libs und Klassenbibliotheken, die es für C++ gibt, inclusive Interfaces (Header-files) und deren aussagefähiger Beschreibung. Ich habe mich bisher an http://cplusplus.com orientiert, aber da fehlt mir doch noch etliches...

    Kanntest du http://www.cppreference.com schon? Das wurde mir mal empfohlen.

    mfG,
    steckl

    1. Hello Steckl,

      Außerdem suche ich eine Übersicht über alle gängigen Libs und Klassenbibliotheken, die es für C++ gibt, inclusive Interfaces (Header-files) und deren aussagefähiger Beschreibung. Ich habe mich bisher an http://cplusplus.com orientiert, aber da fehlt mir doch noch etliches...

      Kanntest du http://www.cppreference.com schon? Das wurde mir mal empfohlen.

      Kannte ich noch nicht.
      Ich aber eine schöne Zusammenstellung.
      Habe ich gleich erst mal durchgeschaut...

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Hallo!

      kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking betreiben kann?

      Tut mir leid, das ist mir weder in C noch in C++ untergekommen. Kann es sein, dass das Locking automatisch geschieht?

      Nein, das passiert nicht. Allerdings kann man in C direkt die entsprechenden API-Funktionen aufrufen, die Locking betreiben, die da sind:

      UNIX und kompatible (inkl. Linux und Mac OS X):
        - flock
        - fcntl mit entspr. Parametern
        - lockf

      Windows (ab NT mit NTFS als Dateisystem):
        - LockFileEx

      Genauere Informationen finden sich in der API-Doku der entsprechenden Funktionen. Es gibt auch diverse Bibliotheken, die das platformübergreifend abstrahieren - allerdings sind das meist Bibliotheken, die noch weitaus mehr machen und wo das nur ein kleiner Teil ist.

      Viele Grüße,
      Christian

      1. Hi,

        Kann es sein, dass das Locking automatisch geschieht?

        Nein, das passiert nicht. Allerdings kann man in C direkt die entsprechenden API-Funktionen aufrufen, die Locking betreiben, die da sind:

        Komisch dass das bis jetzt noch nie in der Programmier-Vorlesung angesprochen wurde.

        UNIX und kompatible (inkl. Linux und Mac OS X):
          - flock
          - fcntl mit entspr. Parametern
          - lockf

        Aber einige gute Quellen wurden dafür angesprochen.
        Die Beschreibungen zu den hier genannten Funktionen gibt es in diesem Index.
        Der Dozent war Unix-Programmierer, darum gab es kaum gute Quellen für Windows.

        mfG,
        steckl

      2. Hello,

        Genauere Informationen finden sich in der API-Doku der entsprechenden Funktionen.

        Wo finde ich die?

        Es gibt auch diverse Bibliotheken, die das plattformübergreifend abstrahieren - allerdings sind das meist Bibliotheken, die noch weitaus mehr machen und wo das nur ein kleiner Teil ist.

        Das Interessante ist dabei, dass im OS (WinDOS) alles nur über ein Byte (Filemode HighNibble) gesteuert wird; zumindest bis Windows NT(Server) funktionierte das einwandfrei. Nur die Workstation hatte für lokale Files, die durch mehrere Prozesse gleichzeitig benutzt werden "Sonderregeln".

        Bei Turbo-Pascal funktioniert das auch bei Win XP wieder, allerdings nur für 8.3-Konvention, die extended filesystem interrupts (für lange Dateinamen) habe bisher nicht zum Laufen gebracht.

        C gibt den File-Mode leider nicht transparent weiter, sondern verwendet die bekannten Namen dafür (w, r, a, +, b, ...) als "Übersetzung". Außerdem ist das Konzept ein anderes, als das der "frühen Filesysteme" und ihrer Interrupts. Könnte das daran liegen, dass C eigentlich für Unix und nicht für Intel-DOSen erfunden wurde?

        Mit C++ habe ich leider bisher noch überhaupt nicht locked, zumindest nicht wissentlich und selbst gezielt veranlasst.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      3. Moin.

        Die GNU C Library stellt außerdem noch folgende Funktionen bereit.

        Christoph

        1. Nochmal ich: Erst lesen, dann verstehen und erst danach antworten ;)

          Das verlinkte Kapitel bezieht sich offensichtlich auf Locking bzgl. verschiedener Threads, nicht Prozesse. Dafür scheint die von Christian genannte Funktion fcntl verantwortlich (siehe hier und hier).

          Christoph

  2. Hallo Tom,

    kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking betreiben kann?

    Meines Wissens unterstützen die C++-Iostreams kein Locking (allerdings kenne ich die nicht so besonders gut, weil ich die nicht mag), Du musst das also anders machen. Zum Beispiel über native C-Funktionen auf die eigentlichen Dateideskriptoren.

    Viele Grüße,
    Christian

    1. Hello Christian,

      kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking betreiben kann?

      Meines Wissens unterstützen die C++-Iostreams kein Locking (allerdings kenne ich die nicht so besonders gut, weil ich die nicht mag), Du musst das also anders machen. Zum Beispiel über native C-Funktionen auf die eigentlichen Dateideskriptoren.

      Ich hatte mir gedacht, dass man die Klassen ggf. ableiten könne und dann über den Filedescriptor ein Locking einbauen könnte... Allerdings müsste das vermutlich schon bei IOS_base geschehen.

      Aber dafür verstehe ich momentan noch zuwenig von den Streams.
      Über die ersten Eigenarten bin ich gerade erst gestolpert.

      Gibt es irgendwo eine Aussage darüber, wieviel Bytes oder Zeichen von einer Datei beim Einlesen tatsächlich im Stream-Buffer gehalten wird?

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hello,

        Aber dafür verstehe ich momentan noch zuwenig von den Streams.
        Über die ersten Eigenarten bin ich gerade erst gestolpert.

        Es gibt eine recht umfassende Übersicht über C/C++ auf
        http://poli.cs.vsb.cz/c/help/

        Die Filemodes, die mir vertraut sind, gehören noch in die DOS-Zeit
        http://poli.cs.vsb.cz/c/help/dos.htm#LBL212
        http://poli.cs.vsb.cz/c/help/io0.htm#LBL20

        Die sind aber in diversen Windows noch verfügbar... vermutlich wegen Kompatibilität?

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. hi!

    kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking
    betreiben kann? Habe mal wieder den ganzen Tag gesucht, und leider nur
    halbgares Zeug gefunden.

    Wie schon bei einer deiner letzten Fragen ueber Streams, ist das extrem
    systemabhaengig. Du solltest mal anfangen dazuzuschreiben, fuer welches
    System du solche Sachen wissen willst.

    Die API-Dokumentationen sind uebrigens unter Unix meist die man-Pages, fuer
    Windows ist http://msdn.microsoft.com/en-us/library/ recht hilfreich.

    bye, Frank!

    --
    Never argue with an idiot. He will lower you to his level and then
    beat you with experience.
    1. Hello,

      kann mir jemand weiterhelfen, wie man im Streamkonzept von C++ Locking
      betreiben kann? Habe mal wieder den ganzen Tag gesucht, und leider nur
      halbgares Zeug gefunden.

      Wie schon bei einer deiner letzten Fragen ueber Streams, ist das extrem
      systemabhaengig. Du solltest mal anfangen dazuzuschreiben, fuer welches
      System du solche Sachen wissen willst.

      Prinzipiell hast Du ja Recht, dass doch alles systemabhängig ist...
      Aber ich hatte nun gehofft, dass es im Streamkonzeot eine einheitliche Lösung für mehrere Plattformen gäbe. Zu irgendwas muss die OOP doch schließlich gut sein ;-P

      Das mit den Man-Pages ist ein guter Tipp. Wenn ich den Linux-Host endlich soweit habe, dass er das tut, was ich will, geht es darauf auch los. Bisher ist nur Bedarf für alle WinDOSen mit x86 Intel-Prozessoren oder kompatiblen ab DOS 3.0 aufwärts.

      Die API-Dokumentationen sind uebrigens unter Unix meist die man-Pages, fuer
      Windows ist http://msdn.microsoft.com/en-us/library/ recht hilfreich.

      Die habe ich schon mehrfach verflucht, weil sie mir oft zu dürftig ist.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de