Necesito asegurarme de que el usuario pueda ejecutar solo una instancia de mi programa a la vez.
Lo que significa que tengo que verificar programáticamente si el mismo programa ya se está ejecutando y lo dejo en ese caso.¿Cómo bloquear la ejecución de dos instancias del mismo programa?
Lo primero que me vino a la mente fue crear un archivo en algún lugar, cuando se inicia el programa. Luego, cada otra instancia del programa verificará este archivo y saldrá si lo encontró.
El problema es que el programa siempre debe salir correctamente y poder eliminar el archivo que creó, para que esto funcione. En caso de, por ejemplo, un corte de energía, el archivo de bloqueo permanece en su lugar y no se puede volver a iniciar el programa.
Para resolver esto, decidí almacenar el ID del proceso del primer programa en el archivo de bloqueo y cuando se inicia otra instancia, comprueba si el PID del archivo está conectado a algún proceso en ejecución.
Si el archivo no existe, está vacío o el PID no corresponde a ningún proceso existente, el programa continúa ejecutándose y escribe su propio PID en el archivo.
Parece que funciona bastante bien: incluso después de un apagado inesperado, la posibilidad de que el ID del proceso (ahora obsoleto) se asocie con algún otro programa, parece ser bastante bajo.
Pero todavía no se siente bien (hay es una posibilidad de quedar bloqueado por algún proceso no relacionado) y trabajar con identificadores de proceso parece ir más allá del estándar C++ y probablemente tampoco sea muy portátil.
Entonces, ¿hay otra forma (más limpia y segura) de hacer esto? Idealmente, debería funcionar con el estándar ISO 98 C++ y con Windows y * nix por igual.
Si no se puede hacer de plataforma independiente, Linux/Unix es una prioridad para mí.
si dos personas copiar el código que podría terminar con el mismo APPLICATION_INSTANCE_MUTEX_NAME: -> –
ya que deben utilizar su propia cadena única :) Me hizo pensar en cambiarlo a la mía aunque :) es –
Hay una variante de Linux C++ del Método 1? (específicamente C++ 11) ¡Sería increíble ver un ejemplo también! –