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