Necesito tener un programa de instancia única en Linux. Es decir, si alguien intenta ejecutar el programa, la nueva instancia debería imprimir un mensaje y salir. Por el momento tengo un mecanismo de bloqueo como este:
main() { // init some stuff... // set or check lock auto pidFile = open("/var/run/my-app.lock", O_CREAT | O_RDWR, 0666); auto rc = flock(pidFile, LOCK_EX | LOCK_NB); if(rc) { if(errno == EWOULDBLOCK) { cout << "Program is already running!\n"; exit(0); } } // do other stuff or the main loop // when the loop ends by sigkill or sigterm or ... exit(0); } El problema es si hago algo que genere procesos secundarios usando int system(const char *command); y en algún momento, alguien usa "matar" para finalizar este programa, los procesos secundarios permanecerán activos y el bloqueo no se eliminará, lo que impedirá que mi aplicación se ejecute nuevamente.
¿Hay una solución a esta deficiencia?
Necesita O_CLOEXEC como bandera para open() . Entonces el identificador no estará abierto en el proceso secundario.
system() eventualmente llama a exec() , que es como se cargan los nuevos binarios de proceso.