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;
}