Forum: Compiler & IDEs Zwei Programme auf eine Datei zugreifen lassen


von Ersi (cell85)


Lesenswert?

Hi,

ich hab ein Programm a) welches in eine csv datei Messwerte im zyklus 
von 1sec reinschreibt.

Ich hab ein Programm b) welches ein Skript in einem Webinterface ist und 
auf Java basiert.

Ich würde gerne das Webinterface so umprogrammieren, das es die Werte 
live visualisiert.

Ich frage mich ob das überhaupt so möglich ist? Wenn Programm a) immer 
schreibt und b) dann auch lesen möchte?  Sperrt das eine das andere 
nicht Zugrifftechnisch aus?

Welche möglichkeit gibts da eigentlich?

von Bitflüsterer (Gast)


Lesenswert?

Dazu müsste man mal mehr Details über das System haben.

Im allgemeinen aber sollte gleichzeitig lesender und schreibender 
Zugriff kein Problem darstellen. Beide sollten keine exkklusiven Locks 
setzen. Wenn man beide Programm verändern kann, dann kann man das auch 
ändern.

Es gibt natürlich Detailprobleme, wie die Behandlung von erst teilweise 
geschriebenen Daten, aber das sollte sich lösen lassen, wenn man das 
lesende Programm verändern darf.

von Ersi (cell85)


Lesenswert?

es handelt sich hierbei um ein linux betriebssystem (ubuntu).
Ich konzipiere gerade, daher kann ich nich soviel zum Programm an sich 
sagen.
Ich arbeite beim schreiben mit dem fstream (c++) beim lesen mit 
javascripts

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

Wenn Du sowieso beide Programme selbst schreibst, dann würde ich mir das 
Geraffel mit dem lesen aus der CSV-Datei ganz sparen und einfach aus dem 
schreibenden Programm in einen Socket schreiben und in dem 
Java-Leseprogramm wieder rauslesen. Dann entfällt auch das Problem mit 
den teilweise geschriebenen Einträgen.

von Ersi (cell85)


Lesenswert?

Das ist eine ganz gute Idee. Du sprichst von UDP Sockets nicht wahr?
Ich wollte Programm a) auf eine SD-Karte schreiben lassen. Ich könnte 
aber dann wenigstens eine Routine integrieren die beim lesen, keine 
Kollision mit dem Schreibvorgang verursacht und die Daten dann an den 
Socket bereitstellen.

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

>Ich wollte Programm a) auf eine SD-Karte schreiben lassen. Ich könnte
>aber dann wenigstens eine Routine integrieren die beim lesen, keine
>Kollision mit dem Schreibvorgang verursacht und die Daten dann an den
>Socket bereitstellen.

Ich bin nicht sicher ob ich Dich recht verstehe. Für mich liest sich 
Deine Antwort so, als wenn Du die Daten erst auf die SD-Karte schreiben 
und wieder von dort lesen willst und das Gelesene in den Socket 
schieben.

Falls Du das so meinst: Nein. Das schreiben in den Socket kannst Du ja 
unabhängig vom schreiben auf die SD-Karte machen. Das hat miteinander 
nichts zu tun.

Falls Du es nicht so meinst: Dann hoffentlich wie ich eben beschrieben 
habe. Falls das auch nicht, dann habe ich Dich total falsch verstanden.

Dieses: "...aber dann wenigstens ... " irritiert mich am meisten. Es 
gibt mit dem Socket keine potentiellen Konflikte mit anderen Vorgängen.

von Rolf Magnus (Gast)


Lesenswert?

Ersan G. schrieb:
> Das ist eine ganz gute Idee. Du sprichst von UDP Sockets nicht wahr?

Wenn die Programme auf verschiedenen Rechnern laufen können sollen, 
bietet sich das an. Rein lokal ginge auch ein Unix Socket. Da spart man 
sich, daß die Daten immer durch den ganzen IP-Stack durch müssen. Spielt 
aber bei deiner Datenrate keine große Rolle.

> Ich wollte Programm a) auf eine SD-Karte schreiben lassen. Ich könnte
> aber dann wenigstens eine Routine integrieren die beim lesen, keine
> Kollision mit dem Schreibvorgang verursacht und die Daten dann an den
> Socket bereitstellen.

Was meinst du damit? Nochmal ein Programm, das aus dem File liest und 
die Daten in den Socket schreibt? Das klingt eher unsinnig, denn die 
Idee mit dem Socket war ja gerade zur Vermeidung des Lesens aus dem File 
gedacht.
Oder meinst du, daß dein Programm, das die Daten erzeugt, diese einfach 
parallel einmal ins File und einmal in den Socket schreibt? Das wäre 
eher die zu bevorzugende Methode.

von Stefan R. (srand)


Lesenswert?

Ersan G. schrieb:
> javascripts

Was soll das sein? In Java schreibt man keine Skripte ("Java-Scripts"?), 
Javascript hingegen ist kein Java.

Klär doch erstmal, was du eigentlich vorhast.

von tictactoe (Gast)


Lesenswert?

Ersan G. schrieb:
> ich hab ein Programm a) welches in eine csv datei Messwerte im zyklus
> von 1sec reinschreibt.

Ersan G. schrieb:
> es handelt sich hierbei um ein linux betriebssystem (ubuntu).

Ersan G. schrieb:
> Ich wollte Programm a) auf eine SD-Karte schreiben lassen.

Dann pass besser auf, dass du die Karte mit geeigneten 
Caching-Einstellungen mountest/betreibst: Bei einem sofortigen 
Write-Through pro Messwert hast du pro Tag 86400 Schreibzyklen, und 
deine SD-Karte ist in nullkommanix hinüber.

von Ersi (cell85)


Lesenswert?

Stefan Rand schrieb:
> Ersan G. schrieb:
>> javascripts
>
> Was soll das sein? In Java schreibt man keine Skripte ("Java-Scripts"?),
> Javascript hingegen ist kein Java.
>
> Klär doch erstmal, was du eigentlich vorhast.

Ich denke es ist klar das ich JavaScript meine oder? :P


>Dann pass besser auf, dass du die Karte mit geeigneten
>Caching-Einstellungen mountest/betreibst: Bei einem sofortigen
>Write-Through pro Messwert hast du pro Tag 86400 Schreibzyklen, und
>deine SD-Karte ist in nullkommanix hinüber.

Ich benutze eine industriells Flashlaufwerk welches genau für solche 
Zwecke gemacht worden ist.

>Dieses: "...aber dann wenigstens ... " irritiert mich am meisten. Es
>gibt mit dem Socket keine potentiellen Konflikte mit anderen Vorgängen

Ja ich mache es genauso wie du es sagtest.

Zum Programm an sich nochmal. Es handelt sich ja um einen Datenlogger. 
Das Webinterface visualisiert so zu sagen die Daten und das 
worker-Programm nimmt die Daten auf und schreibt sie auf die Karte.
Die Kommunikation unter den Programmen mache ich dann per Unix Socket, 
damit das Webinterface die Daten aus dem File lesen kann.

von Bitflüsterer (Gast)


Lesenswert?

Ersan G. schrieb:
> Stefan Rand schrieb:
>> Ersan G. schrieb:
>>> javascripts
>>
>> Was soll das sein? In Java schreibt man keine Skripte ("Java-Scripts"?),
>> Javascript hingegen ist kein Java.
>>
>> Klär doch erstmal, was du eigentlich vorhast.
>
> Ich denke es ist klar das ich JavaScript meine oder? :P
>
Dann musst Du Dich mal eindeutig äussern und nicht in jedem Post was 
anderes schreiben. :-)
Eigentlich ist das deswegen nicht eindeutig, weil Du im ersten Post 
schreibst "Java" und später "JavaScript". Das sind zwei verschiedene 
Dinge. In Java-Script hast Du z.B. keinen Zugriff auf Unix-Sockets. 
Hingegen aber auf TCP-Sockets.

>>Dieses: "...aber dann wenigstens ... " irritiert mich am meisten. Es
>>gibt mit dem Socket keine potentiellen Konflikte mit anderen Vorgängen
>
> Ja ich mache es genauso wie du es sagtest.
>
Was denn nun? Verzweifel... Grummel... Siehe unten.
Und warum genau schreibst Du nun "... aber dann wenigstens..."? Das ist 
mir immer noch nicht klar.

> Die Kommunikation unter den Programmen mache ich dann per Unix Socket,
> damit das Webinterface die Daten aus dem File lesen kann.

Nein! Das Webinterface liest die Daten nicht aus dem File. Aber das 
Programm, dass die Daten in das File schreibt, sendet sie unabhängig 
davon in den Socket.

von Kai S. (zigzeg)


Lesenswert?

Ersan G. schrieb:

> Ich frage mich ob das überhaupt so möglich ist? Wenn Programm a) immer
> schreibt und b) dann auch lesen möchte?  Sperrt das eine das andere
> nicht Zugrifftechnisch aus?

Nein, das ist gar kein Problem. Anders als bei Windows, wo per Default 
immer nur ein Prozess eine Datei oeffnen kann, koennen unter Linux 
beliebig viele Prozesse dieselbe Datei lesend und schreibend oeffnen.
Bei mehreren Schreibern entsteht natuerlich unter umstanden Chaos, fuer 
das der Programmierer zustaendig ist (z.B. kann man einzelne Bereiche, 
oder die ganze Datei lock()en, hier aber nicht noetig).

Das einzige was man beachten sollte ist eventuelles Caching zu beachten. 
So sollte auf der Seite des Schreibers fflush() aufgerufen werden, damit 
die Daten auch in der Datei / auf dem Flash landen. Auf Seiten des 
Lesers empfielt es sich die Datei z.B. jede Sekunde neu zu oeffnen, die 
Daten zu lesen, und anschliessend wieder zu schliessen. 
Performancemaessig sollte das bei 1 Datum pro Sekunde alles unkritisch 
sein.

Mit einem Socket geht es sicher auch, schein mir allerdings wesentlich 
komplizierter zu sein.

ZigZeg

von Ersi (cell85)


Lesenswert?

super antwort danke!

entschuldigung den anderen gegenüber wegen der nicht eindeutigen 
fragestellung.

Ich werde mal ein Testprogramm schreiben.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Überlege einfach mal, wie "tail -f Datei" unter Unix/Linux arbeitet. 
Dann ist Dein Problem eigentlich schon gelöst.

von Bitflüsterer (Gast)


Lesenswert?

>entschuldigung den anderen gegenüber wegen der nicht eindeutigen
>fragestellung.

Es  geht hier nicht um Schuld oder Nicht-Schuld sondern darum, dass ein 
technisches Gespräch oder auch ein erteilter Rat für beide Seiten 
befriedigender ist, wenn man Klarheit schafft.
In diesem Sinne ist meine erneute Frage auch nicht als Vorwurf zu sehen 
sondern nur als Hinweis, dass für mich die Frage noch offen ist. Um mehr 
geht es dabei garnicht.

Ein Hinweis noch:
Überlege mal genau, was die Antworten von Kai und Frank technisch 
voraussetzen. Erst dannn entscheide Dich dafür oder dagegen.

von Ersi (cell85)


Lesenswert?

So ich denke dann machen wir das doch ganz einfach und ich schreibe hier 
die Ausgangsfrage neu:

Es gibt zwei Applikationen. Die eine schreibt Messdaten auf einen 
externen Speicher in einem Zyklus von 1sek.
Die zweite Applikation liest aus der Datei die Daten und visualisiert 
sie.

Kann es zu Problemen kommen wenn Programm A) auf Datei X schreibend 
zugreift und Programm B) lesen möchte?

Lösung 1)

Unix socket Kommunikation unter den beiden Programmen:
Programm A) schreibt und schreibt, irgendwann gibt Programm B) einen 
Lese-Request über den Socket an Programm A weiter. Programm A) sendet 
die geschriebenen Daten bzw. die Daten im angeforderten Zeitraum an B) 
weiter.


Lösung 2)
Es macht generell keine Probleme A) kann schreiben und B) kann einfach 
lesen.
..

so ok ? :D

: Bearbeitet durch User
von gnd3 (Gast)


Lesenswert?

Weder 1) noch 2) funktioniert "einfach so" problemlos, aber man bringt 
beide zum Laufen, siehe oben.

Falls du für die Visualisierung GTK benutzt, wären noch die POSIX 
message queues interessant (man mq_overview). Die lassen sich besonders 
einfach in das GTK-Event-System einbinden:
1
queue = mq_open ("/filename", O_RDONLY);
2
g_io_add_watch (g_io_channel_unix_new (queue), G_IO_IN,...);

von Klaus W. (mfgkw)


Lesenswert?

Einfacher als mit TCP-Sockets oder Unix-Domain-Sockets können Prozesse 
auch mit FIFO ("named pipe") plaudern.
Dazu macht man mit mkfifo auf der Konsole oder in seinem C-Programm den 
FIFO, danach öffnet der eine die Pseudodatei zum Schreiben, der andere 
zum Lesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.