problema con shmget
Que pasa gente,
A ver, pregunta, el codigo que pego mas abajo me da errores si quiero reservar
memoria para aproximadamente mas de 150 estructuras.
He probado a cambiar por diferentes valores la clave de ftok. Si por ejemplo
uso como clave ".", me deja reservar memoria para muy pocas. Si uso "/tmp"
unas cuantas mas, si uso "/dev/null" otras cuantas....
Pero tiene que ver la clave con la memoria pedida? Yo quiero poder reservar un
trozo de memoria compartida de 1000 o 2000 estructuras... que problema hay?
Está en la clave o donde? :?
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/types.h>
#include <string.h>
#include <sys/time.h> //gettymeofday
#include <unistd.h>
struct a
{
int t1;
int t2;
timeval t3;
} *nets;
key_t clave;
int shmid;
main()
{
int num=20;
clave=ftok(".",\'a\');
// clave=ftok("/tmp",\'a\');
shmid=shmget(clave,sizeof(a)*num,IPC_CREAT | 0600);
nets=(a *)shmat(shmid,0,0);
//a partir de aqui es solo debug...
shmid_ds lalaa;
shmctl(shmid,IPC_STAT,&lalaa);
fprintf(stdout,"tamanio segmento: %d\n", lalaa.shm_segsz);
fprintf (stderr, "sizeof: %d\n",sizeof(a)*num);
switch(errno)
{
case EINVAL: printf ("EINVAL");break;
case EEXIST: printf ("EEXIST");break;
case EIDRM: printf ("EIDRM");break;
case ENOSPC: printf ("ENOSPC");break;
case ENOENT: printf ("ENOENT");break;
case EACCES: printf ("EACCESS");break;
case ENOMEM: printf ("ENOMEM");break;
}
fprintf (stderr, "error %d, %s\n", errno, strerror (errno));
fprintf(stdout, "dirección de nets: <%x>\n",nets);
}
Un saludo,
were
A ver, pregunta, el codigo que pego mas abajo me da errores si quiero reservar
memoria para aproximadamente mas de 150 estructuras.
He probado a cambiar por diferentes valores la clave de ftok. Si por ejemplo
uso como clave ".", me deja reservar memoria para muy pocas. Si uso "/tmp"
unas cuantas mas, si uso "/dev/null" otras cuantas....
Pero tiene que ver la clave con la memoria pedida? Yo quiero poder reservar un
trozo de memoria compartida de 1000 o 2000 estructuras... que problema hay?
Está en la clave o donde? :?
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/types.h>
#include <string.h>
#include <sys/time.h> //gettymeofday
#include <unistd.h>
struct a
{
int t1;
int t2;
timeval t3;
} *nets;
key_t clave;
int shmid;
main()
{
int num=20;
clave=ftok(".",\'a\');
// clave=ftok("/tmp",\'a\');
shmid=shmget(clave,sizeof(a)*num,IPC_CREAT | 0600);
nets=(a *)shmat(shmid,0,0);
//a partir de aqui es solo debug...
shmid_ds lalaa;
shmctl(shmid,IPC_STAT,&lalaa);
fprintf(stdout,"tamanio segmento: %d\n", lalaa.shm_segsz);
fprintf (stderr, "sizeof: %d\n",sizeof(a)*num);
switch(errno)
{
case EINVAL: printf ("EINVAL");break;
case EEXIST: printf ("EEXIST");break;
case EIDRM: printf ("EIDRM");break;
case ENOSPC: printf ("ENOSPC");break;
case ENOENT: printf ("ENOENT");break;
case EACCES: printf ("EACCESS");break;
case ENOMEM: printf ("ENOMEM");break;
}
fprintf (stderr, "error %d, %s\n", errno, strerror (errno));
fprintf(stdout, "dirección de nets: <%x>\n",nets);
}
Un saludo,
were
Mira a ver si te esta pasando esto.
Cuando reservas memoria compartida, si luego no la borras, aunque muera el programa, la memoria sigue "viva".
Si intentas reservar otra vez memoria con la misma clave, pero distinto tamaño, obtendras un error. Es posible que en tus pruebas dejes memoria "viva". Eso explicaría por qué cuando cambias de clave si te funciona.
Pon tu programa para que reserve tamaño para las 1000 estructuras que quieres.
Desde una shell o bash, ejecuta el comando
$ ipcs
Este comando te indica qué recursos compartidos tienes en ese momento y los id de cada uno de ellos. Echa un ojo a la memoria compartida que haya en ese momento y mátala. Para matarla, usa el comando
$ ipcrm -m <id_de_la_memoria>
Cuando estes seguro que no queda memoria compartida, ejecuta tu programa a ver si no te da fallo.
Tu codigo, en solaris, funciona correctamente y es capaz de reservar tamaño para 1000 estructuras (he tenido que cambiar el include linux/types por sys/types).
Se bueno.
Cuando reservas memoria compartida, si luego no la borras, aunque muera el programa, la memoria sigue "viva".
Si intentas reservar otra vez memoria con la misma clave, pero distinto tamaño, obtendras un error. Es posible que en tus pruebas dejes memoria "viva". Eso explicaría por qué cuando cambias de clave si te funciona.
Pon tu programa para que reserve tamaño para las 1000 estructuras que quieres.
Desde una shell o bash, ejecuta el comando
$ ipcs
Este comando te indica qué recursos compartidos tienes en ese momento y los id de cada uno de ellos. Echa un ojo a la memoria compartida que haya en ese momento y mátala. Para matarla, usa el comando
$ ipcrm -m <id_de_la_memoria>
Cuando estes seguro que no queda memoria compartida, ejecuta tu programa a ver si no te da fallo.
Tu codigo, en solaris, funciona correctamente y es capaz de reservar tamaño para 1000 estructuras (he tenido que cambiar el include linux/types por sys/types).
Se bueno.
