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 kille 😞

    jemand eine idee?
    oder eine andere idee wie ich verhinder, dass das prog mehrfach gestartet wird?

    gruß part


Anmelden zum Antworten