• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

HILFE: mehrere Prozesse auf einen einzelnen Ordner zugreifen

Hallo erstmal im Forum!

Ich bin neu hier und habe erst vor kurzem angefangen auf Linux zu programmieren - und schon stehe ich vor einem Problem.

Folgendes ist los:
In einem Ordner "bilder" sind ca. 1000 Bilder hinterlegt. Nun habe ich ein Programm geschrieben welches bei jedem Aufruf (von einer Anderen Anwendung) ein anderes Bild in diesem Ordner per Symlink verlinkt und diesen Link an die Anwednung zurückgibt. Soweit so gut.
Jetzt ist es aber so, dass mein Programm von anderen Anwendungen bis zu 21 Mal zur gleichen Zeit aufgerufen werden kann. D.h. jetzt kann es vorkommen, dass bei diesen gleichzeitigen Aufrufen 2 gleiche Bilder verlinkt werden, was nicht vorkommen darf...

Ich habe schon mit einer Art text-basiereden Datenbank probiert, aber da hatte ich das Problem mit dem Locken der Text-Datei zu kämpfen. D.h. bei jedem Aufruf wird die txt-Datei kurzzeitig gesperrt, dann ändert das Programm die Datei und entsperrt sie wieder. Die anderen Prozesse warten quasi bis die Datei entsperrt wurde. Das ganze hat aber nicht so richtig funktioniert...

Hat jemand von euch eine Idee wie man ein solches Problem lösen kann? Da es sich um ein Embedded-Linux handelt kann ich aus Speicherplatzgründen kein mySQL o.ä. installieren..

Danke schon mal im Voraus für eure Ideen und Hilfe! :)

Mfg
holly123
 
A

Anonymous

Gast
Hier wirst du wohl auf die Dauer nicht ohne IPC (Inter Prozess Communikation) auskommen.
Stichworte in Manpages oder im Internet ipc ; named pipe ; message queue ; semaphore

robi
 
Hi Robi,

vielen Dank für deine Infos!

Ich habe mich jetzt ein bisschen eingelesen in die Thematik des IPCs. Sehr Interessant und sehr Umfangreich.... Ich denke mal, dass für meine Anwendung die Semaphore am besten geeignet sind. Lock-Files, so wie ich das auch schon probiert habe sind wohl die schlechtere Methode, Message Queue oder Shared Memory oder Pipes denke ich sind bei meiner Anwendung auch die falsche Wahl.

holly123
 
Vielleicht ist es einfacher neben den Verzeichnis Bilder, ein Verzeichnis Bilder-benutzt zu erstellen, dort zuerst einen "hard link" auf die Orginaldatei mit gleichen Namen erzeugen und diesen per "soft link" zur Applikation weiterleiten. Der Trick ist der, das ein "hard link" den "link count" einer Datei erhöht und den müßte leicht über die glibc abfragen können. Will man die Verbindung lösen entfernt man den "soft-" und "hard link" und der "link count" der Orginaldatei ist wieder eins.
 
A

Anonymous

Gast
Tooltime schrieb:
Der Trick ist der, das ein "hard link" den "link count" einer Datei erhöht und den müßte leicht über die glibc abfragen können.
Solche Spirenzchen könnte man noch auf der Konsole im Script versuchen. In höheren Programmiersprachen besonders wenn es zeitkritisch und sensibel wird, wird das extrem unsicher.
Stell dir nur mal vor, ein Prozess ließt den Linkcounter aus der Inode aus, dann ist seine Rechenzeit an der CPU erst mal vorbei. Es kommt der nächste Prozess und legt einen Link an. Wenn der erste Prozess jetzt wieder an die CPU kommt und den vorhin abgeholten Wert jetzt auswertet, ist dieser schon nicht mehr aktuell. Semaphore ist eine Möglichkeit, da ich den Zugriff anderer Prozesse, auf was auch immer, solange blockieren kann, bis die kritische Phase im eigenem Prozess vorbei ist.

robi
 
Ich hab mich wohl nicht korrekt augedrükt. Eine semaphore sollte denn Zugriff regeln, da stimme ich 100% zu. Eine semaphore weiß aber nicht welche Dateien verlinkt sind. Meine Idee war, die Datenbank durch einen "hard link" zu ersetzen. Die überleben einen Neustart im Gegensatz zu semaphoren, falls man auf die Idee kommt für jedes Bild eine zu erzeugen. Der Haken meiner Idee ist natürlich noch, das man nicht weiß wo der Softlink sitzt, der auf das Bild verweist.
 
im moment ist es so dass die GIF-Bilder mit einer anderen Endung (*.GIV) in dem Ordner abgelegt sind. Bevor aber die verlinkung stattfindet wird die Datei noch nach *.GIF umbenannt.... somit brauche ich keine Hard-Links etc.
 
Oben