jedenkrat

dvorakj na apollo.karlov.mff.cuni.cz dvorakj na apollo.karlov.mff.cuni.cz
Pátek Srpen 29 14:29:16 CEST 1997


Jiri Jindra wrote:
| 
| Dobry den, opet mam jeden dotaz pro programatory:
| 
| Napisu program a chci zajistit, aby program bezel vzdy jen jedenkrat,
| abych si ho z jine relace nemohl pustit podruhe, a vyhnout se pripadne
| kolizi dat, protoze do zamykani souboru se zatim nechci poustet.
| 
| Napadl me zpusob trochu neohrabany:
| na zacatku programu testovat existenci souboru a pokud existuje -> program
| je jiz spusten. 
| 
To zase neni az tak neohrabane. Neprimym dukazem pro toto tvrzeni je i fakt, ze to
tak dela rada well-known programu, jako treba pppd, gpm, lpd, sendmail, apache, elm.
Typicky program ${prog} vytvori soubor /var/run/${prog}.pid, jehoz obsahem je jeho PID,
tedy cislo. Kdyz program konci (pozor, i na signal), smaze tento svuj soubor. 
Vyhodou teto cesty je i to, ze je vcelku prenositelna na libovolny operacni system
(i nektere pasqily).

Mohl byste se pokusit napriklad prohledavat /proc, ale to je vec specificka
pro Linux -- jine Unixy to mohou mit take, ale struktura se bude lisit.
A muze to zabrat i dost casu.
|
| Muzete mi prosim napsat nejake techniky, jak toho dosahnout?
|
Neco na tento zpusob:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
// mozna jeste jine hlavicky?

void myapp_cleanup()
{
  remove("/var/run/myapp.pid");
}

int main(int argc, const char** argv)
{
  FILE* pidfile = fopen("/var/run/myapp.pid","r");
  if ( (pidfile == NULL)		// nedal se otevrit
    && (errno == ENOENT) )		// a to proto, ze neexistuje
  {
    pidfile = fopen("/var/run/myapp.pid","w");
    fprintf(pidfile,"%d",getpid());		// lze vynechat
    fclose(pidfile);

    // a delej svou praci

    myapp_cleanup();
    return 0;
  } else {
    fprintf(stderr,"myapp: Already running. Remove /var/run/myapp.pid"
                   " if you are sure it isn't running.\n");
    return 1;
  }
}
|
| Dekuji
| 
| Jirka
| 



Další informace o konferenci Linux