nur eine Instanz
-
hi,
möchte gern unter Linux ein C++-Prog schreiben, von dem immer nur eine Instanz geöffnet werden kann. Also beim Programmstart soll es überprüfen, ob schon eine Instanz läuft und sich dann beenden, wenn das der Fall ist.
Wie mache ich das ?Danke im voraus
-
Viele Programme machen es so, dass sie eine Datei zB. in /tmp anlegen und das Starten verweigern, wenn diese schon existiert. Musst du beim beenden natürlich wieder löschen.
-
...und dran denken dass diese datei beim killen ev. nicht gelöscht wird...
-elvis
-
DrGreenthumb schrieb:
Viele Programme machen es so, dass sie eine Datei zB. in /tmp anlegen und das Starten verweigern, wenn diese schon existiert.
/tmp? Dafuer gibts doch /var/run!
elve schrieb:
...und dran denken dass diese datei beim killen ev. nicht gelöscht wird...
Und deshalb prueft man zusaetlich noch, ob man ein exclusives Lock auf die Datei kriegen kann. Wenn ja, weiss man, dass die Datei bei einem unsauberen Programmende uebriggeblieben ist.
-
SG1 schrieb:
/tmp? Dafuer gibts doch /var/run!
bei mir ist /var/run:
drwxr-xr-x 9 root root 4096 2004-03-25 09:20 /var/run
hab ich das dann irgendwann verhunzt, oder liegt das an Debian?
-
Nö,bei Suse scheint das auch so zu sein.Die Rechte sind genauso gesetzt.
Ich denke,es wäre sicherlich nicht falsch,in /tmp einfach eine Datei mit der aktuellen PID des Programms zu speichern,und während selbiges noch läuft,einen Lock drauf haben.
Wird es erneut gestartet,findet es die Datei,liest die PID und kann nachsehen,ob die andere Instanz noch läuft,oder unter mysteriösen Umständen gestorben ist.
In jenem Fall kann die Datei aktualisiert werden.
Sollte gehen.
Aber gibt es nicht so etwas wie 'getprocesslist'??Also etwas,was so arbeitet wie top und ps usw.Die Sachen kann man auch als nicht root machen..
MFG,
g_e.
-
licq und kMail legen zum Beispiel im Homeverzeichnis eine Datei mit der aktuellen pID an!
~/.licq/licq.pid
-
cxx schrieb:
hi,
möchte gern unter Linux ein C++-Prog schreiben, von dem immer nur eine Instanz geöffnet werden kann. Also beim Programmstart soll es überprüfen, ob schon eine Instanz läuft und sich dann beenden, wenn das der Fall ist.
Wie mache ich das ?Danke im voraus
Stichwort "Singleton Pattern"?
Q: Was ist das Singleton-Pattern und wie wird es in C++ implementiert?
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Singleton#AnswAnsonsten könntest du es auch wie z.B. Oracle machen und dir ein SharedMemory Segment (oder wars eine Semaphore?) beim erstmaligen Programmstart reservieren. Wenn dein Programm gestartet wird überprüfst du dann, ob das reservierte SharedMemory Segement (respektive: Semaphore) bereits durch eine frühere Instanz reserviert wurde. In diesem Fall beendest du dann das Programm mit einer Meldung.
Eine Frage alllerdings:
Soll dieses Nur-Eine-Instanz-Starten-Können nur per User gelten, oder gar systemweit?
-
Descartes schrieb:
cxx schrieb:
hi,
möchte gern unter Linux ein C++-Prog schreiben, von dem immer nur eine Instanz geöffnet werden kann. Also beim Programmstart soll es überprüfen, ob schon eine Instanz läuft und sich dann beenden, wenn das der Fall ist.
Wie mache ich das ?Danke im voraus
Stichwort "Singleton Pattern"?
Ne, das ist was anderes.
-
DrGreenthumb schrieb:
SG1 schrieb:
/tmp? Dafuer gibts doch /var/run!
bei mir ist /var/run:
drwxr-xr-x 9 root root 4096 2004-03-25 09:20 /var/run
hab ich das dann irgendwann verhunzt, oder liegt das an Debian?
Ne, das gehoert schon so. Aber ein Programm, dass systemweit (und so hatte ich die Frage verstanden) nur einmal gestartet werden kann, sollte auch nur von root gestartet werden duerfen. Ansonsten kann man ja wunderbar die anderen User aergern, indem man einfach das Programm offen haelt.