probleme mit semaphoren bei prozessabruch
-
moins
ich arbeite gerade an einem lizenz server wie der threadstarter hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-139882-and-highlight-is-semaphore.html
also der prozess darf nur einmal laufen. hab das jetzt so probiert und das funzt eigentlich auch:
semaphore.sem_num = 0; semaphore.sem_op = 1; semaphore.sem_flg = SEM_UNDO; int semid; semid = semget (9634567, 0, IPC_PRIVATE); if(semid<0) semid = semget (9634567, 1, IPC_CREAT|IPC_EXCL|0666); else{ std::cout<<"licServer is allready running "; return 0; } if(semctl(semid, 0, SETVAL, 1)==-1) std::cout<<"error beim nummer anlegen "; //semop(semid, &semaphore, 1); sleep(100); semctl (semid, 0, IPC_RMID, 1);´
semctl (semid, 0, IPC_RMID, 1);´löscht den semaphore wie erwartet, allerdings bleibt dieser beim abruch des programms erhalten.
ich muss sicherstellen, das er auch bei einem programmabsturz gelöscht wird, da der key_t ja hardgecodet ist.hoffe jemand weiß rat
gruß part
-
Wenn das Programm abstürzt wirst du mit dem Löschen haben. Wenn es kontrolliert beendet wird kannst du einfach einen Signal Handler installieren.
-
ich bezweifel, dass diese methode etwas bringt. jemand kann einfach n systeme zb. mit qemu emulieren und hat dann, was er will.
-
ok ich fange jetzt strg+c ab und beende dann den semaphore, das klappt gut.
allerdings bleibt noch das problem, wenn ich den prozess killejemand eine idee?
oder eine andere idee wie ich verhinder, dass das prog mehrfach gestartet wird?gruß part