C/Visual C - Correr solo una aplicacion

 
Vista:

Correr solo una aplicacion

Publicado por juan (11 intervenciones) el 28/04/2004 03:19:54
Buenas, lo que quiero saber es como detectar que mi programa esta corriendo y si se lanza otro matar al anterior, en win y en linux.
Agradeceria cual quier solucion que no sea la de grabar el tipico fichero de bloqueo.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Correr solo una aplicacion

Publicado por josema (35 intervenciones) el 28/04/2004 14:18:56
utiliza mutex.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado en parte ¿y linux?

Publicado por juan (11 intervenciones) el 29/04/2004 03:37:27
Gracias por la pista, con esto en el WinMain optengo lo que quiero....¿alguien que me de otra para linux?

if (OpenMutex(MUTEX_ALL_ACCESS, TRUE, \"unico\") != NULL)
{
MessageBox(NULL,\"Mato al que esta funcionando...\", \"openmutex\", MB_OK|MB_ICONWARNING|MB_TASKMODAL|MB_TOPMOST);
SendMessage(FindWindow(szWindowClass, szTitle),WM_SYSCOMMAND, SC_CLOSE, x);
}
if (CreateMutex(NULL, TRUE, \"unico\") == NULL)
{
MessageBox(NULL,\"No puedo crear el mutex\", \"createmutex\", MB_OK|MB_ICONWARNING|MB_TASKMODAL|MB_TOPMOST);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado en parte ¿y linux?

Publicado por chuidiang (677 intervenciones) el 29/04/2004 09:15:18
En linux tienes recursos compartidos para varios procesos, como semáforos, colas de mensajes y memoria compartida. Un programa puede crear cualquiera de ellos o comprobar si ya existe.
En www.geocities.com/chuidiang tienes unos tutoriales sobre esto.

Otra opción, si vale que el nombre del ejecutable no cambie, es hacer un ps para ver si existe ya un programa arrancado. La función popen() de C te ayudará a arrancar el ps y ver su salida, sin necesidad de usar ficheros intermedios.

Espero que algo de esto te sirva.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado!!

Publicado por juan (11 intervenciones) el 30/04/2004 01:33:59
Gracias y saludos a todos, (no me ha hecho falta el popen jejeje)

#include <unistd.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
key_t clave;
int id;
int *memoria = NULL;
pid_t pid;

pid = getpid();
printf("%s PID=%d\n", argv[0], pid);

clave = ftok(argv[0], 66);
if (clave == -1)
{
perror("error al conseguir clave");
exit(1);
}

//obtiene memoria compartida ya existente
id = shmget(clave, sizeof(int)*100, 0777);
if (id == -1)
{// sino existe la creamos (1º vez)
id = shmget(clave, sizeof(int)*100, 0777 | IPC_CREAT);
if (id == -1)
{
perror("error al conseguir id de memoria");
exit(1);
}
memoria = (int *)shmat (id, (char *)0, 0);
if (memoria == NULL)
{
perror("error al conseguir memoria");
exit(1);
}
memoria[0] = pid;
printf("la primera\n", memoria[0]);
}
else
{//ya existe, matamos el proceso (las siguientes)
memoria = (int *)shmat (id, (char *)0, 0);
if (memoria == NULL)
{
perror("error al conseguir memoria");
exit(1);
}
printf("Mato PID=%d\n", memoria[0]);
kill ((pid_t)memoria[0], SIGKILL);

memoria[0] = pid;
printf("la siguiente\n", memoria[0]);
}

sleep(10);

//libera memoria
shmdt ((char *)memoria);
shmctl (id, IPC_RMID, (struct shmid_ds *)NULL);
return 0;

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar