Datei immer neu erzeugen
-
Hallo,
ich schreibe mit einem C-Programm Daten in eine Textdatei.
Die Textdatei wird jedesmal neu erzeugt und dann beschrieben.
(geöffnet mit writeonly und create)
Von der Textdatei lesen nun andere Programme zyklisch ihre Werte aus.
(Shell-Script/C-Prog Perl-Script)Wie ist das nun, erkennen die anderen Programme das kurzeitig keine Daten in der Textdatei stehen, wenn ja wie kann ich das umgehen ?
Danke
worst_case
-
Ja die Programme erkennen, dass keine Daten drinstehen. Du müsstest, bevor du mit dem Schreiben anfängst, die Datei komplett sperren, d. h. es darf von der Datei auch nicht mehr gelesen werden. Erst wenn die Sperre nach dem Schreiben wieder aufgehoben wurde.
-
Morgen,
Wenn ich die Datei mit Write öffne und jeweils die Zeilen überschreibe, kann ich dann auch die Länge(Anzahl) der zeilen verändern.
z.B. Datei hat 10 Zeilen
Datei wird mit write geöffnet und es werden nur 9 Zeilen geschrieben.
Wie kann ich die 10. Zeile löschen bevor ich die Datei schliesse ?Danke
worst_case
-
Wenn du wie du beim ersten mals sagtest die Datei jedesmal neu erzeugst hast du das Problem nicht.
Wenn du die Datei ändern möchtest must du als 10 te Zeile ein Leerzeile
schreibenAber vorsicht wenn andere Programme darauf lesend zugreifen, kann es passieren, das sie eine Änderung nicht mitbekommen weil sie die Daten in
einem lokalen Buffer halten.Interessant wäre zu wissen was du tun willst vielleicht gibt es noch andere Lösungen die vielleicht keine Probleme bereiten.
-
Hi,
mein Prog: Ich lese über die serielle Schnittstelle Daten (Zahlen) ein.
Jede Zahl bekommt eine eigene Zeile in der Datei.
Andere Programme (zeitliches Archivieren für Diagramm) lesen
bestimmte Zeilen ein und be-verarbeiten die Zahlen.
Da ich nicht immer alle Zusatzprogramme benötige, werden manchmal
mehr oder weniger Programme gestartet.
Die Programme die die Zahlenreihen lesen, haben eine feste
Zuordnung auf die Zeilen (lesen immer von der selben Stelle.
Eigentlich haben die Daten die ich lese auch immer die selbe länge
(Anzahl).
Jedoch kann ich die Länge der Daten die ich von der SST lese bei
den Einstellungsarbeiten verändern um einen besseren Überblick zu
erhalten. Deshalb habe ich jedesmal die Datei neu erzeugt.Ich habe mir nun überlegt ich schreibe die Daten in eine 2. Datei
(tmp Datei) und kopiere diese Datei dann mittels Systemaufruf
(kopiere A -> B).
Aber irgendwie gefällt mir das nicht.Danke
worst_case
-
fuer eine solche kommunikation unter verschiedenen prozessen
solltest du auf die os spezifischen moeglichkeiten zugreifen
(shared-memory, pipes).
ich denke mit den dateien wirst du nicht gluecklich.falls du es doch unbedingt mit dateien machst solltest du jedem
programm einen festen offset in der datei zuordnen (sofert die
daten immer die selbe laenge haben). die verschiedenen programme
koennen dann mit fseek auf die entsprechende stelle in der datei
springen und x bytes lesen.meine empfehlung waere aber die ipc des betriebssystems zu nutzen,
das ist effektiver.
-
Abend,
das Problem ist derzeit, das nicht alle Programme in C geschrieben sind.
Ich habe manche in Perl, Shell, Java, C. Was halt am schnellsten zum entwickeln geht.Das Problem ist immer noch das ich wenn ich die datei neu erzeuge, kurzeitig keine Daten in der Datei stehen.
worst_case
-
Dann arbeite mit zwei Dateien.
Die eine ist eine "Lock" Datei, die andere enthält die Daten "Data".
Eine Lock Datei hat keinen Inhalt sie muss nur existieren oder nicht existieren.Schritt 1: Immer wenn du Daten in der "Data" ändern möchtest erzeugst du die "Lock" Datei
Schritt 2: Dann änderst du "Data"
Schritt 3: Du löscht die "Lock" DateiAlle anderen Programm dürfen die "Data" nur dann neu öffnen wenn die Lock Datei nicht existiert.
Damit stellst du sicher das nur wenn gültige Daten in der Datei sind gelesen wird.
kritisch ist der Zeitpunkt zwischen erzeugen der "lock" datei und "ändern", denn es kann passieren das jemand
nach dem "Lock" schaut ihn nicht findet und just in dem Moment wo er auf die Datei zugreift wir der lock gesetzt.Solche Probleme lassen sich dann besser mit Betriebssystemfunktionen wie Signalen und pipes umgehen.
Vielleicht kann man zusammen mit entelechie´s Lösung das Problem umgehen.
Du erzeugst die Daten Datei
Ordnest jedem Datum im File eine feste Position zu offset 0 im File für Datum 1, offset 100 Bytes für Datum 2, offset 250 für Datum3,...
Im ersten Byte dieser Position hälst du ein lokales Flag 0 wenn daten gültig, !=0 wenn update in Progress und unmittelbar dahinter die Daten- Im erzeugenden Programm schreibst du wenn du ändern möchtest zuerst an diesem Offset das Flag !=0,
- scheibst dann die Daten
- setzt das Flag an diesem Offset =0* Im lesenden Programm liest du alles einschließlich flag an diesem Offset
* Danach überprüfst du ob das Flag 0 ist wenn ja hast du gültige Daten, wenn nein wiederhol den Vorgang solange bis das Flag 0 ist,
oder bis du nach 10 mal lesen sagst hier ist ein FehlerWenn du im Lesen irgendwie Sorge hast das währende des lesens die Daten verändert werden , in jedem OS gibt es mehtoden um Actionen als nicht unterprechbar zu kennzeichnen (critikal section, atomic,... oder wie es auch immer im OS heißt, so etwas abr nur mit größter Vorsicht nutzen)
Wenn noch fragen sind, vielleicht haben wir eine Antwort