C++: (File)locking für IO-Streams
Tom
- programmiertechnik
0 steckl0 Christian Seiler0 Frank Schönmann0 Tom
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
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
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
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
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
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
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
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
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
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!
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