tempnam
no crear el archivo, simplemente le da un nombre de archivo que no existía en el momento que lo llamó.
Aún tiene que crear el archivo usted mismo y, por lo tanto, todavía tiene la condición de carrera que otro proceso puede colarse y crearlo antes que usted.
En realidad no quiere utilizar tempnam
ya que le dará a cada proceso de su propio nombre de archivo y que será capaz de ejecutar simultáneamente. Lo que necesita es un nombre de archivo fijo (como /tmp/myapp.lck
por ejemplo) que se abre cada proceso y luego intenta flock
.
Es mejor que con flock
para un archivo de bloqueo, fcntl
le dará un grano más fino de bloqueo (partes de archivos), pero eso no es realmente un requisito aquí.
El código se ejecutaría algo como esto:
if ((mylockfd = open ("/tmp/myapp.lck", O_CREAT | O_RDWR, 0666)) < 0) {
// error, couldn't open it.
return;
}
if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
// error, couldn't exclusive-lock it.
return;
}
:
// Weave your magic here.
:
flock (mylockfd, LOCK_UN);
Eso probablemente necesita un poco de trabajo, pero debe ser un buen comienzo. Una solución más generalizada sería algo así como:
int acquireLock (char *fileSpec) {
int lockFd;
if ((lockFd = open (fileSpec, O_CREAT | O_RDWR, 0666)) < 0)
return -1;
if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
close (lockFd);
return -1;
}
return lockFd;
}
void releaseLock (int lockFd) {
flock (lockFd, LOCK_UN);
close (lockFd);
}
// Calling code here.
int fd;
if ((fd = acquireLock ("/tmp/myapp.lck")) < 0) {
fprintf (stderr, "Cannot get lock file.\n");
return 1;
}
// Weave your magic here.
releaseLock (fd);
Esto parece un duplicado de http://stackoverflow.com/questions/800730/cc-how-to-tell-if-a-program-is-already -running –
@Richard, esa pregunta fue específicamente para Windows. Éste es casi seguro que un UNIXy de tipo uno ya que (1) 'tempnam' está desfasada y en VC2005, (2) la referencia del código'/tmp/myapp_random' que no es realmente una cosa de Windows. – paxdiablo